Audio Session — централни механизам iOS-а за управљање аудио понашањем апликације: интеракција са системом, обрада прекида и рутирање звука. Свака iOS апликација добија јединствену аудио сесију која одређује како се звук понаша при закључавању екрана, позивима и повезивању Bluetooth-а. Према Apple Developer Documentation, 2026, Audio Session се подешава кроз категорију и режим — без правилне конфигурације апликација можда неће репродуковати звук у позадини.
Главне ствари
Audio Session — је јединствена инстанца AVAudioSession коју креира систем при покретању апликације и постоји током целог њеног животног циклуса. Делује као посредник између апликације и аудио система iOS-а: подешавање категорије одређује да ли апликација може да репродукује звук у позадини, да ли ће звук бити пригушен при позиву и на које уређаје ће се аудио изводити.
За разлику од Android Audio Focus-а, где свака апликација независно захтева и ослобађа фокус, iOS Audio Session се централизовано управља кроз једну сесију по апликацији. При активацији сесије, систем аутоматски деактивира сесију претходне апликације, шаљући јој обавештење о прекиду. Ова архитектонска разлика одређује другачији приступ обради звука на две платформе.
Према WWDC 2024 Session 211, око 40% проблема са звуком у iOS апликацијама је узроковано неправилном конфигурацијом Audio Session-а. Најчешћа грешка — избор категорије ambient уместо playback, због чега звук нестаје при закључавању екрана.
При покретању, апликација добија sharedInstance сесије, поставља категорију кроз позив setCategory(_:mode:options:) и активира сесију кроз setActive(true). Након активације, iOS узима у обзир политике категорије за рутирање. Ако друга апликација активира своју сесију, тренутна добија обавештење AudioSessionInterruptionType.began путем Notification.Name.AVAudioSessionInterruption.
Категорија — главни параметар Audio Session-а, који одређује шест предефинисаних варијанти понашања. Избор категорије је прва и најважнија одлука при конфигурацији звука у iOS-у.
| Категорија | Када користити | Позадински аудио | Пригушење при mute |
|---|---|---|---|
| ambient | Игрице, позадински ефекти | Не | Да |
| playback | Музика, подкасти, аудиокњиге | Да | Не |
| record | Диктафон, снимање звука | Не | Н/П |
| playAndRecord | VoIP, гласовне поруке | Да | Не |
| multiRoute | DJ миксери, караоке | Да | Не |
| soloAmbient | Подразумевано (iOS default) | Не | Да |
За музичке и видео плејере увек користите playback. Ова категорија омогућава: репродукцију звука при закључаном екрану, при искљученом mute прекидачу (физичко дугме на кућишту 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("Podešavanje Audio Session-a nije uspelo: \(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)
Категорија playAndRecord са режимом voiceChat оптимизује аудио пут за гласовну комуникацију: укључује поништавање еха, аутоматско подешавање појачања (AGC) и бира оптимални кодек. OverrideOutputAudioPort(.speaker) форсира излаз кроз звучник чак и када су слушалице повезане — корисно за разговор без слушалица.
Позив setActive(true) активира сесију и обавештава систем да ће апликација користити аудио. При паузирању репродукције, препоручује се деактивирање сесије како би друге апликације могле да добију аудио ток. Изузетак — апликације са дуготрајном позадинском репродукцијом (музика, подкасти), где сесија остаје активна током целог записа.
Важно је обрађивати грешке при setActive. Ако је друга сесија високог приоритета активна (нпр. Телефон при позиву), setActive може да избаци грешку. У том случају потребно је сачекати обавештење AudioSessionInterruptionType.ended и поновити активацију.
Режим (mode) прецизира категорију и оптимизује аудио пут за одређени тип употребе. Сваки режим мења понашање AGC-а, поништавања еха и кодека. Режими не замењују категорију, већ је допуњују — једна категорија може да ради са различитим режимима.
Опције пружају фино подешавање понашања сесије. Свака опција је заставица која се комбинује са другима у низу. На пример, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] омогућава излаз звука на Bluetooth слушалице, коришћење звучника подразумевано и миксовање са аудио књигама.
У iOS 17+ појавила се опција spatialAudio, која укључује персонализовани просторни звук за AirPods преко AVAudioSessionSpatialPreferences. Према WWDC 2024, просторни звук повећава ангажовање корисника музичких апликација за 25% у Apple тестовима.
Прекиди (interruptions) — кључна разлика између 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, настављање није дозвољено.
Када друга апликација активира свој Audio Session са категоријом playback, тренутна сесија добија обавештење о прекиду. Ако друга апликација користи ambient, прекид се не дешава — звуци се миксују. Ово понашање се коренито разликује од Android-а, где свака активација Audio Focus-а изазива догађај LOSS.
За апликације које треба да наставе репродукцију при активацији других сесија (нпр. навигација док свира музика), користите опцију .mixWithOthers. Ова опција дозвољава миксовање звука са другим апликацијама, а прекиди се не шаљу. MixWithOthers — iOS еквивалент duck режима у Android-у.
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 је једна централизована сесија по апликацији, која се подешава једном. Audio Focus у Android-у захтева ручно захтевање фокуса сваки пут при репродукцији. Поред тога, iOS подржава миксовање кроз опцију mixWithOthers, док је у Android-у duck једина алтернатива потпуном заустављању.
Најчешћи узрок — неправилна категорија Audio Session-а. Ако је изабрана ambient или soloAmbient, звук се зауставља при закључавању екрана. Промените категорију на playback и уверите се да је у Info.plist додат Background Modes — Audio, AirPlay, and Picture in Picture.
Додајте опцију .mixWithOthers у setCategory. Ово ће омогућити миксовање звука ваше апликације са другим активним сесијама. Без ове опције, нова апликација прекида тренутну. MixWithOthers — еквивалент duck режима у Android-у, али са потпуним очувањем јачине звука.
Користите overrideOutputAudioPort са nil за аутоматски избор. За принудни излаз на Bluetooth: узмите AVAudioSessionRouteDescription из availableOutputs, изаберите порт са типом .bluetoothA2DP и проследите га overrideOutputAudioPort-у. Уверите се да је сесија подешена са allowBluetooth.
За већину апликација — да. Деактивација сесије при паузи омогућава другим апликацијама да добију аудио фокус. Изузетак — музички плејери са дуготрајном позадинском репродукцијом. Ако је пауза кратка (мање од 5 секунди), боље је оставити сесију активном за брзи наставак.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође