Audio Session — iOS-ning ilovaning audio harakatini boshqarish uchun markaziy mexanizmi: tizim bilan o‘zaro aloqa, uzilishlarni qayta ishlash va tovushni yo‘naltirish. Har bir iOS ilovasi bitta audio sessiyani oladi, u ekran bloklanganda, qo‘ng‘iroqlar va Bluetooth ulanishida tovush qanday harakat qilishini aniqlaydi. Apple Developer Documentation, 2026 ma’lumotiga ko‘ra, Audio Session kategoriya va rejim orqali sozlanadi — to‘g‘ri konfiguratsiyasiz ilova fonda tovush chiqara olmasligi mumkin.
Asosiy fikrlar
Audio Session — tizim tomonidan ilova ishga tushirilganda yaratiladigan va uning butun hayotiy sikli davomida mavjud bo‘ladigan yagona AVAudioSession namunasidir. U ilova va iOS audio tizimi o‘rtasida vositachi vazifasini bajaradi: kategoriya sozlamasi ilovaning fonda tovush chiqara olishini, qo‘ng‘iroq vaqtida tovushning pasaytirilishini va audioning qaysi qurilmalarga chiqarilishini aniqlaydi.
Har bir ilova mustaqil ravishda fokus talab qiladigan va bo‘shatadigan Android Audio Focus-dan farqli o‘laroq, iOS Audio Session ilova bo‘yicha bitta sessiya orqali markazlashtirilgan holda boshqariladi. Sessiya faollashtirilganda, tizim avtomatik ravishda oldingi ilovaning sessiyasini o‘chiradi va unga uzilish haqida xabarnoma yuboradi. Ushbu arxitektura farqi ikki platformada audioni qayta ishlashga turlicha yondashuvni belgilaydi.
WWDC 2024 Session 211 ma’lumotiga ko‘ra, iOS ilovalaridagi audio muammolarining taxminan 40% Audio Session noto‘g‘ri konfiguratsiyasidan kelib chiqadi. Eng keng tarqalgan xato — playback o‘rniga ambient kategoriyasini tanlash, bu esa ekran bloklanganda tovushning yo‘qolishiga olib keladi.
Ishga tushirilganda, ilova sessiyaning sharedInstance-ni oladi, setCategory(_:mode:options:) chaqiruvi orqali kategoriyani o‘rnatadi va setActive(true) orqali sessiyani faollashtiradi. Faollashtirilgandan so‘ng, iOS yo‘naltirish uchun kategoriya siyosatlarini hisobga oladi. Agar boshqa ilova o‘z sessiyasini faollashtirsa, joriy ilova Notification.Name.AVAudioSessionInterruption orqali AudioSessionInterruptionType.began xabarnomasini oladi.
Kategoriya — Audio Session-ning oltita oldindan belgilangan harakat variantini aniqlaydigan asosiy parametri. Kategoriya tanlash iOS-da audio konfiguratsiyasidagi birinchi va eng muhim qarordir.
| Kategoriya | Qachon ishlatish | Fonda audio | Mute rejimida pasaytirish |
|---|---|---|---|
| ambient | O‘yinlar, fon effektlari | Yo‘q | Ha |
| playback | Musiqa, podkastlar, audiokitoblar | Ha | Yo‘q |
| record | Diktafon, tovush yozish | Yo‘q | Y/T |
| playAndRecord | VoIP, ovozli xabarlar | Ha | Yo‘q |
| multiRoute | DJ mikserlari, karaoke | Ha | Yo‘q |
| soloAmbient | Odatiy (iOS default) | Yo‘q | Ha |
Musiqa va video pleyerlar uchun doim playback dan foydalaning. Ushbu kategoriya quyidagilarga imkon beradi: bloklangan ekranda tovush chiqarish, o‘chirilgan mute tugmasi (iPhone korpusidagi jismoniy tugma) bilan va minimallashtirilgan ilovada tovush chiqarish. Playback kategoriyasisiz sessiya ekran bloklanganda yoki ilova minimallashtirilganda o‘chadi.
Ambient kategoriyasi o‘yinlar va fon tovushlari bo‘lgan ilovalar uchun mos keladi — boshqa ilovalarga ijroni davom ettirishga imkon beradi. Masalan, foydalanuvchi musiqa tinglayotgan bo‘lsa va ambient sessiyasi bilan o‘yinni ochsa, musiqa o‘yin tovushlari bilan birga ijro etilishda davom etadi. Bu Android-dan tubdan farq qiladi, bu yerda bunday stsenariy aniq duck ruxsatini talab qiladi.
Audio Session konfiguratsiyasi har qanday ijro boshlanishidan oldin bajarilishi kerak. Sessiyani application(_:didFinishLaunchingWithOptions:) metodida yoki pleyer inicializatorida sozlash tavsiya etiladi. Kategoriyani sozlagandan so‘ng, sessiyani faollashtirish kerak.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Audio Session sozlamasi muvaffaqiyatsiz tugadi: \(error.localizedDescription)")
}
Options parametri allowBluetooth (Bluetooth naushnikiga chiqish) va defaultToSpeaker (gapirish dinamigi o‘rniga karnay orqali ijro) ni o‘z ichiga oladi. allowBluetooth opsiyasi Bluetooth naushniklarini qo‘llab-quvvatlaydigan ilovalar uchun majburiydir — usiz tovush hatto naushnik ulangan bo‘lsa ham ichki karnay orqali chiqishi mumkin.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
PlayAndRecord kategoriyasi voiceChat rejimi bilan ovozli aloqa uchun audio yo‘lini optimallashtiradi: aks-sadoni bostirish, avtomatik kuchaytirishni sozlash (AGC) va optimal kodekni tanlashni o‘z ichiga oladi. OverrideOutputAudioPort(.speaker) hatto naushnik ulangan bo‘lsa ham tovushni karnay orqali chiqarishga majbur qiladi — karnayli aloqa uchun foydali.
SetActive(true) chaqiruvi sessiyani faollashtiradi va tizimga ilova audiodan foydalanishi haqida xabar beradi. Ijro to‘xtatilganda, boshqa ilovalar audio oqimini olishi uchun sessiyani o‘chirish tavsiya etiladi. Istisno — uzoq muddatli fonda ijro qiladigan ilovalar (musiqa, podkastlar), bu yerda sessiya butun trek davomida faol qoladi.
SetActive da xatolarni boshqarish muhim. Agar yuqori prioritetli boshqa sessiya faol bo‘lsa (masalan, qo‘ng‘iroq vaqtida Telefon), setActive xato berishi mumkin. Bunday holda AudioSessionInterruptionType.ended xabarnomasini kutish va faollashtirishni takrorlash kerak.
Rejim (mode) kategoriyani aniqroq belgilaydi va audio yo‘lini muayyan foydalanish turi uchun optimallashtiradi. Har bir rejim AGC, aks-sadoni bostirish va kodeklarning harakatini o‘zgartiradi. Rejimlar kategoriyani almashtirmaydi, balki uni to‘ldiradi — bitta kategoriya turli rejimlar bilan ishlashi mumkin.
Opsiyalar sessiya harakatini nozik sozlashni ta’minlaydi. Har bir opsiya massivda boshqalar bilan birlashtiriladigan bayroqdir. Masalan, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] tovushni Bluetooth naushnikiga chiqarish, odatiy bo‘yicha karnaydan foydalanish va audiokitoblar bilan aralashtirishga imkon beradi.
iOS 17+ da AVAudioSessionSpatialPreferences orqali AirPods uchun shaxsiylashtirilgan fazoviy tovushni faollashtiradigan spatialAudio opsiyasi paydo bo‘ldi. WWDC 2024 ma’lumotiga ko‘ra, fazoviy tovush Apple testlarida musiqa ilovalari foydalanuvchilarining jalb qilinishini 25% ga oshiradi.
Uzilishlar (interruptions) — Audio Session-ni Android Audio Focus-dan asosiy farqi. iOS-da uzilishlar AVAudioSession.interruptionNotification ga obuna bo‘lish orqali NotificationCenter orqali qayta ishlanadi. Xabarnoma uzilish turiga ega lug‘atni o‘z ichiga oladi: began yoki 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 olinganda pleyer ijroni to‘xtatishi kerak. InterruptionType.ended da interruptionOptionKey xususiyati pleyerning avtomatik ravishda davom ettirishi mumkinligini ko‘rsatadi (shouldResume). Agar foydalanuvchi qo‘ng‘iroqni tugatgan bo‘lsa, shouldResume = true. Agar qo‘ng‘iroq vaqt tugashi bilan tugagan bo‘lsa — shouldResume = false, davom ettirish mumkin emas.
Boshqa ilova playback kategoriyasi bilan o‘z Audio Session-ni faollashtirganda, joriy sessiya uzilish haqida xabarnoma oladi. Agar boshqa ilova ambient dan foydalansa, uzilish sodir bo‘lmaydi — tovushlar aralashtiriladi. Bu xatti-harakat Android-dan tubdan farq qiladi, bu yerda har qanday Audio Focus faollashtirilishi LOSS hodisasini keltirib chiqaradi.
Boshqa sessiyalar faollashtirilganda ijroni davom ettirishi kerak bo‘lgan ilovalar uchun (masalan, musiqa ijro etilayotganda navigatsiya) .mixWithOthers opsiyasidan foydalaning. Ushbu opsiya tovushni boshqa ilovalar bilan aralashtirishga ruxsat beradi va uzilishlar yuborilmaydi. MixWithOthers — Android-dagi duck rejimining iOS analoglari.
Audio Session ichki karnaylar, naushniklar, Bluetooth naushniklari va AirPlay qurilmalari o‘rtasida tovushni yo‘naltirishni avtomatik boshqaradi. Ilova joriy yo‘nalishni currentRoute xususiyati orqali kuzatishi va AVAudioSession.routeChangeNotification orqali o‘zgarishlar haqida xabarnomalar olishi mumkin.
Bluetooth naushniklari ulanganda, iOS sessiya allowBluetooth opsiyasi bilan sozlangan bo‘lsa, avtomatik ravishda audio chiqishini ularga o‘tkazadi. Ushbu opsiyasiz tovush ichki karnay orqali oqishda davom etadi. iOS 16 dan boshlab, AirPods Pro ulanganda tizim kechikishni kamaytirish uchun avtomatik ravishda ProMotion sinxronizatsiyasini faollashtiradi.
RouteChangeNotification ga obuna bo‘lish naushniklarning ulanishi va uzilishiga reaksiya berishga imkon beradi. Bluetooth naushnigi uzilganda pleyer ijroni to‘xtatishi kerak — foydalanuvchi tovush telefon karnayidan chiqishini kutmasligi mumkin. Apple HIG (2026) ma’lumotiga ko‘ra, bu musiqa ilovalari uchun majburiy xatti-harakatdir.
AvailableInputs va availableOutputs xususiyatlari mavjud audio qurilmalar ro‘yxatini ularning turlari bilan qaytaradi (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Dasturchi moslashtirilgan yo‘naltirish stsenariylari uchun overrideOutputAudioPort orqali dasturiy ravishda muayyan qurilmani tanlashi mumkin.
Tez-tez beriladigan savollar
Asosiy farq — arxitektura. Audio Session — ilova bo‘yicha bitta markazlashtirilgan sessiya, bir marta sozlanadi. Android-da Audio Focus har safar ijroda qo‘lda fokus talab qiladi. Bundan tashqari, iOS mixWithOthers opsiyasi orqali aralashtirishni qo‘llab-quvvatlaydi, Android-da esa duck to‘liq to‘xtatishning yagona alternatividir.
Eng keng tarqalgan sabab — Audio Session-ning noto‘g‘ri kategoriyasi. Agar ambient yoki soloAmbient tanlangan bo‘lsa, tovush ekran bloklanganda to‘xtaydi. Kategoriyani playback ga o‘zgartiring va Info.plist da Background Modes — Audio, AirPlay, and Picture in Picture qo‘shilganligiga ishonch hosil qiling.
SetCategory da .mixWithOthers opsiyasini qo‘shing. Bu ilovangiz tovushining boshqa faol sessiyalar bilan aralashtirilishiga imkon beradi. Ushbu opsiyasiz yangi ilova joriy ilovani to‘xtatadi. MixWithOthers — Android-dagi duck rejimining analogi, ammo tovush darajasi to‘liq saqlanib qoladi.
Avtomatik tanlash uchun overrideOutputAudioPort dan nil bilan foydalaning. Bluetooth-ga majburiy chiqish uchun: availableOutputs dan AVAudioSessionRouteDescription oling, .bluetoothA2DP turidagi portni tanlang va overrideOutputAudioPort ga uzating. Sessiya allowBluetooth bilan sozlanganligiga ishonch hosil qiling.
Aksariyat ilovalar uchun — ha. To‘xtash vaqtida sessiyani o‘chirish boshqa ilovalarga audio fokusni olishga imkon beradi. Istisno — uzoq muddatli fonda ijro qiladigan musiqa pleyerlari. Agar pauza qisqa bo‘lsa (5 soniyadan kam), tez davom ettirish uchun sessiyani faol saqlash yaxshiroqdir.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.