Audio Session iOS کا مرکزی طریقہ کار ہے جو ایپلیکیشن کے آڈیو رویے کو منظم کرتا ہے: سسٹم کے ساتھ تعامل، مداخلتوں کو سنبھالنا اور آڈیو روٹنگ۔ ہر iOS ایپلیکیشن کو ایک واحد آڈیو سیشن ملتا ہے جو یہ طے کرتا ہے کہ اسکرین لاک ہونے پر، کالز کے دوران اور Bluetooth منسلک کرتے وقت آواز کیسے برتاؤ کرتی ہے۔ Apple Developer Documentation، 2026 کے مطابق، Audio Session کو زمرہ اور موڈ کے ذریعے ترتیب دیا جاتا ہے — درست ترتیب کے بغیر، ایپلیکیشن پس منظر میں آواز نہیں چلا سکتی۔
اہم نکات
Audio Session AVAudioSession کی ایک واحد مثال ہے جو سسٹم کے ذریعے اس وقت بنائی جاتی ہے جب کوئی ایپلیکیشن لانچ ہوتی ہے اور اپنی پوری زندگی کے چکر میں موجود رہتی ہے۔ یہ ایپلیکیشن اور iOS آڈیو سسٹم کے درمیان ایک ثالث کے طور پر کام کرتا ہے: زمرے کی ترتیب طے کرتی ہے کہ آیا ایپلیکیشن کو پس منظر میں آواز چلانے کی اجازت ہے، کیا کال کے دوران آواز خاموش ہوگی، اور کن آلات پر آڈیو آؤٹ پٹ کرنا ہے۔
Android Audio Focus کے برعکس، جہاں ہر ایپلیکیشن آزادانہ طور پر فوکس کی درخواست کرتی ہے اور جاری کرتی ہے، iOS Audio Session کو فی ایپلیکیشن ایک سیشن کے ذریعے مرکزی طور پر منظم کیا جاتا ہے۔ جب کوئی سیشن فعال ہوتا ہے، سسٹم خود بخود پچھلی ایپلیکیشن کے سیشن کو غیر فعال کر دیتا ہے، اسے مداخلت کی اطلاع بھیجتا ہے۔ یہ آرکیٹیکچرل فرق دونوں پلیٹ فارمز پر آڈیو ہینڈلنگ کے مختلف طریقوں کی وضاحت کرتا ہے۔
WWDC 2024 سیشن 211 کے مطابق، iOS ایپلیکیشنز میں تقریباً 40% آڈیو مسائل غلط Audio Session ترتیب کی وجہ سے ہوتے ہیں۔ سب سے عام غلطی playback کی بجائے ambient زمرہ کا انتخاب کرنا ہے، جس کی وجہ سے اسکرین لاک ہونے پر آواز غائب ہو جاتی ہے۔
لانچ ہونے پر، ایپلیکیشن سیشن کا sharedInstance حاصل کرتی ہے، setCategory(_:mode:options:) کال کے ذریعے زمرہ متعین کرتی ہے اور setActive(true) کے ذریعے سیشن کو فعال کرتی ہے۔ فعال ہونے کے بعد، iOS روٹنگ کے لیے زمرے کی پالیسیوں پر غور کرتا ہے۔ اگر کوئی دوسری ایپلیکیشن اپنا سیشن فعال کرتی ہے، تو موجودہ ایپلیکیشن Notification.Name.AVAudioSessionInterruption کے ذریعے AudioSessionInterruptionType.began کی اطلاع حاصل کرتی ہے۔
زمرہ Audio Session کا بنیادی پیرامیٹر ہے، جو چھ پہلے سے طے شدہ رویے کے اختیارات کی وضاحت کرتا ہے۔ زمرہ کا انتخاب iOS میں آڈیو ترتیب دیتے وقت پہلا اور سب سے اہم فیصلہ ہے۔
| زمرہ | کب استعمال کریں | پس منظر کا آڈیو | خاموش سوئچ متاثر کرتا ہے |
|---|---|---|---|
| ambient | گیمز، پس منظر کے اثرات | نہیں | ہاں |
| playback | موسیقی، پوڈکاسٹ، آڈیو بکس | ہاں | نہیں |
| record | وائس میمو، آڈیو ریکارڈنگ | نہیں | لاگو نہیں |
| playAndRecord | VoIP، وائس پیغامات | ہاں | نہیں |
| multiRoute | DJ مکسر، کاراؤکے | ہاں | نہیں |
| soloAmbient | ڈیفالٹ (iOS default) | نہیں | ہاں |
موسیقی اور ویڈیو پلیئرز کے لیے، ہمیشہ playback استعمال کریں۔ یہ زمرہ اجازت دیتا ہے: اسکرین لاک ہونے پر، خاموش سوئچ بند ہونے پر (iPhone پر جسمانی بٹن)، اور ایپلیکیشن پس منظر میں ہونے پر آواز چلانا۔ playback زمرہ کے بغیر، اسکرین لاک ہونے یا ایپلیکیشن چھوٹی ہونے پر سیشن غیر فعال ہو جاتا ہے۔
ambient زمرہ گیمز اور پس منظر کی آوازوں والی ایپلیکیشنز کے لیے موزوں ہے — یہ دوسری ایپلیکیشنز کو جاری رکھنے دیتا ہے۔ مثال کے طور پر، اگر کوئی صارف موسیقی سن رہا ہے اور ambient سیشن والا گیم کھولتا ہے، تو موسیقی گیم کی آوازوں کے اوپر چلتی رہتی ہے۔ یہ Android سے ایک بنیادی فرق ہے، جہاں اس طرح کے منظر نامے کے لیے واضح duck اجازت درکار ہوتی ہے۔
Audio Session کی ترتیب کسی بھی پلے بیک شروع ہونے سے پہلے کی جانی چاہیے۔ application(_:didFinishLaunchingWithOptions:) طریقہ کار میں یا پلیئر کے ابتدائیہ میں سیشن ترتیب دینے کی سفارش کی جاتی ہے۔ زمرہ متعین کرنے کے بعد، سیشن کو فعال کرنا ضروری ہے۔
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Audio Session سیٹ اپ ناکام: \(error.localizedDescription)")
}
options پیرامیٹر میں allowBluetooth (Bluetooth ہیڈسیٹ پر آؤٹ پٹ) اور defaultToSpeaker (ایئر پیس کے بجائے اسپیکر کے ذریعے پلے بیک) شامل ہے۔ allowBluetooth اختیار Bluetooth ہیڈفونز کو سپورٹ کرنے والی ایپلیکیشنز کے لیے لازمی ہے — اس کے بغیر، ہیڈسیٹ منسلک ہونے پر بھی آواز بلٹ ان اسپیکر پر جا سکتی ہے۔
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
voiceChat موڈ کے ساتھ playAndRecord زمرہ صوتی مواصلات کے لیے آڈیو پاتھ کو بہتر بناتا ہے: ایکو کینسلیشن، آٹومیٹک گین کنٹرول (AGC) کو فعال کرتا ہے اور بہترین کوڈیک کا انتخاب کرتا ہے۔ OverrideOutputAudioPort(.speaker) ہیڈسیٹ منسلک ہونے پر بھی اسپیکر کے ذریعے آؤٹ پٹ پر مجبور کرتا ہے — اسپیکر فون کے لیے مفید۔
setActive(true) کال کرنے سے سیشن فعال ہوتا ہے اور سسٹم کو مطلع کرتا ہے کہ ایپلیکیشن آڈیو استعمال کرے گی۔ جب پلے بیک روکا جاتا ہے، سیشن کو غیر فعال کرنے کی سفارش کی جاتی ہے تاکہ دوسری ایپلیکیشنز آڈیو سٹریم حاصل کر سکیں۔ استثنا لمبے پس منظر میں پلے بیک (موسیقی، پوڈکاسٹ) والی ایپلیکیشنز ہیں، جہاں سیشن پورے ٹریک کے دوران فعال رہتا ہے۔
setActive کال کرتے وقت غلطیوں کو سنبھالنا ضروری ہے۔ اگر زیادہ ترجیح والا کوئی دوسرا سیشن فعال ہے (مثال کے طور پر، کال کے دوران فون)، setActive ایک غلطی پھینک سکتا ہے۔ اس صورت میں، AudioSessionInterruptionType.ended کی اطلاع کا انتظار کریں اور فعال کرنے کی دوبارہ کوشش کریں۔
موڈ زمرہ کو بہتر کرتا ہے اور ایک مخصوص استعمال کے معاملے کے لیے آڈیو پاتھ کو بہتر بناتا ہے۔ ہر موڈ AGC، ایکو کینسلیشن اور کوڈیکس کے رویے کو تبدیل کرتا ہے۔ موڈ زمرہ کو تبدیل نہیں کرتے بلکہ اس کی تکمیل کرتے ہیں — ایک زمرہ مختلف موڈ کے ساتھ کام کر سکتا ہے۔
اختیارات سیشن کے رویے کی باریک ترتیب فراہم کرتے ہیں۔ ہر اختیار ایک جھنڈی ہے جسے ایک صف میں دوسروں کے ساتھ ملایا جا سکتا ہے۔ مثال کے طور پر، [.allowBluetooth، .defaultToSpeaker، .interruptSpokenAudioAndMix] Bluetooth ہیڈسیٹ پر آواز کے آؤٹ پٹ کی اجازت دیتا ہے، ڈیفالٹ طور پر اسپیکر استعمال کرتا ہے اور آڈیو بکس کے ساتھ ملایا جاتا ہے۔
iOS 17+ پر spatialAudio اختیار ظاہر ہوا، جو AVAudioSessionSpatialPreferences کے ذریعے AirPods کے لیے ذاتی نوعیت کی مقامی آواز کو فعال کرتا ہے۔ WWDC 2024 کے مطابق، Apple کے ٹیسٹوں میں مقامی آواز موسیقی کی ایپلیکیشنز میں صارف کی مصروفیت میں 25% اضافہ کرتی ہے۔
مداخلتیں Audio Session اور Android Audio Focus کے درمیان ایک اہم فرق ہیں۔ iOS میں، مداخلتوں کو NotificationCenter کے ذریعے AVAudioSession.interruptionNotification کو سبسکرائب کرکے سنبھالا جاتا ہے۔ اطلاع میں مداخلت کی قسم کے ساتھ ایک لغت ہوتی ہے: began یا ended۔
override func viewDidLoad() {
super.viewDidLoad()
let center = NotificationCenter.default
center.addObserver(
self,
selector: #selector(handleInterruption),
name: AVAudioSession.interruptionNotification,
object: nil
)
}
@objc func handleInterruption(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let type = userInfo[AVAudioSession.interruptionTypeKey]
as? AVAudioSessionInterruptionType
else { return }
switch type {
case began:
pausePlayback()
case ended:
guard let options = userInfo[AVAudioSession.interruptionOptionKey]
as? AVAudioSessionInterruptionOptions
else { return }
if options.contains(shouldResume) {
resumePlayback()
}
}
جب interruptionType.began موصول ہوتا ہے، پلیئر کو پلے بیک روک دینا چاہیے۔ جب interruptionType.ended موصول ہوتا ہے، interruptionOptionKey پراپرٹی بتاتی ہے کہ کیا پلیئر خود بخود دوبارہ شروع کر سکتا ہے (shouldResume)۔ اگر صارف نے کال مسترد کر دی، shouldResume = true۔ اگر کال ٹائم آؤٹ پر ختم ہوئی — shouldResume = false، دوبارہ شروع کرنے کی اجازت نہیں۔
جب کوئی دوسری ایپلیکیشن playback زمرہ کے ساتھ اپنا Audio Session فعال کرتی ہے، تو موجودہ سیشن کو مداخلت کی اطلاع ملتی ہے۔ اگر کوئی دوسری ایپلیکیشن ambient استعمال کرتی ہے، تو کوئی مداخلت نہیں ہوتی — آوازیں مل جاتی ہیں۔ یہ رویہ Android سے یکسر مختلف ہے، جہاں کوئی بھی Audio Focus فعالی LOSS ایونٹ کو متحرک کرتا ہے۔
ان ایپلیکیشنز کے لیے جنہیں دوسرے سیشن فعال ہونے پر پلے بیک جاری رکھنے کی ضرورت ہے (مثال کے طور پر، موسیقی چلتے ہوئے نیویگیشن)، .mixWithOthers اختیار استعمال کریں۔ یہ اختیار دوسری ایپلیکیشنز کے ساتھ آواز ملانے کی اجازت دیتا ہے، اور کوئی مداخلت نہیں بھیجی جاتی۔ MixWithOthers Android میں duck موڈ کا iOS ہم منصب ہے۔
Audio Session خود بخود بلٹ ان اسپیکرز، ہیڈفونز، Bluetooth ہیڈسیٹس اور AirPlay آلات کے درمیان آڈیو روٹنگ کا انتظام کرتا ہے۔ ایپلیکیشن currentRoute پراپرٹی کے ذریعے موجودہ راستے کی نگرانی کر سکتی ہے اور AVAudioSession.routeChangeNotification کے ذریعے تبدیلیوں کے بارے میں اطلاعیں حاصل کر سکتی ہے۔
جب Bluetooth ہیڈفونز منسلک ہوتے ہیں، iOS خود بخود آڈیو آؤٹ پٹ کو ان پر منتقل کر دیتا ہے اگر سیشن allowBluetooth اختیار کے ساتھ ترتیب دیا گیا ہو۔ اس اختیار کے بغیر، آواز بلٹ ان اسپیکر کے ذریعے جاری رہتی ہے۔ iOS 16 سے شروع ہو کر، جب AirPods Pro منسلک ہوتے ہیں، سسٹم خود بخود تاخیر کم کرنے کے لیے ProMotion مطابقت پذیری کو فعال کرتا ہے۔
routeChangeNotification کو سبسکرائب کرنے سے ہیڈفون کے منسلک اور منقطع ہونے پر رد عمل ظاہر کرنے کی اجازت ملتی ہے۔ جب Bluetooth ہیڈسیٹ منقطع ہوتا ہے، پلیئر کو پلے بیک روک دینا چاہیے — صارف کو توقع نہیں ہو سکتی کہ فون کے اسپیکر سے آواز آنے لگے۔ Apple HIG (2026) کے مطابق، موسیقی کی ایپلیکیشنز کے لیے یہ لازمی رویہ ہے۔
availableInputs اور availableOutputs پراپرٹیز اپنی اقسام (builtInSpeaker، headphones، bluetoothA2DP، hdmi) کے ساتھ دستیاب آڈیو آلات کی فہرست لوٹاتی ہیں۔ ڈویلپر حسب ضرورت روٹنگ منظرناموں کے لیے overrideOutputAudioPort کے ذریعے پروگرام کے ذریعے ایک مخصوص آلہ منتخب کر سکتا ہے۔
اکثر پوچھے گئے سوالات
بنیادی فرق آرکیٹیکچر ہے۔ Audio Session فی ایپلیکیشن ایک مرکزی سیشن ہے جو ایک بار ترتیب دیا جاتا ہے۔ Android میں Audio Focus کو چلاتے وقت ہر بار دستی طور پر فوکس کی درخواست کرنے کی ضرورت ہوتی ہے۔ اس کے علاوہ، iOS mixWithOthers اختیار کے ذریعے ملاوٹ کو سپورٹ کرتا ہے، جبکہ Android میں duck مکمل روکنے کا واحد متبادل ہے۔
سب سے عام وجہ غلط Audio Session زمرہ ہے۔ اگر ambient یا soloAmbient منتخب کیا گیا ہے، تو اسکرین لاک ہونے پر آواز رک جاتی ہے۔ زمرہ کو playback میں تبدیل کریں اور یقینی بنائیں کہ Info.plist میں Background Modes — Audio, AirPlay, and Picture in Picture شامل کیا گیا ہے۔
setCategory میں .mixWithOthers اختیار شامل کریں۔ یہ آپ کی ایپلیکیشن کی آواز کو دوسرے فعال سیشنز کے ساتھ ملانے کی اجازت دے گا۔ اس اختیار کے بغیر، ایک نئی ایپلیکیشن موجودہ کو روک دیتی ہے۔ MixWithOthers Android میں duck موڈ کا مشابہ ہے، لیکن مکمل حجم کے تحفظ کے ساتھ۔
خودکار انتخاب کے لیے nil کے ساتھ overrideOutputAudioPort استعمال کریں۔ Bluetooth پر زبردستی آؤٹ پٹ کے لیے: availableOutputs سے AVAudioSessionRouteDescription حاصل کریں، .bluetoothA2DP قسم کا ایک پورٹ منتخب کریں اور اسے overrideOutputAudioPort کو بھیجیں۔ یقینی بنائیں کہ سیشن allowBluetooth کے ساتھ ترتیب دیا گیا ہے۔
زیادہ تر ایپلیکیشنز کے لیے — ہاں۔ روکنے پر سیشن کو غیر فعال کرنے سے دوسری ایپلیکیشنز کو آڈیو فوکس مل سکتا ہے۔ استثنا لمبے پس منظر میں پلے بیک والے موسیقی کے پلیئرز ہیں۔ اگر روکنا مختصر ہے (5 سیکنڈ سے کم)، فوری دوبارہ شروع کرنے کے لیے سیشن کو فعال رکھنا بہتر ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں