Audio Session — шта је то, категорије и конфигурација у iOS-у

Аутор: IT Sectr Објављено: 2026-05-24 Време читања: 8 мин

Audio Session — централни механизам iOS-а за управљање аудио понашањем апликације: интеракција са системом, обрада прекида и рутирање звука. Свака iOS апликација добија јединствену аудио сесију која одређује како се звук понаша при закључавању екрана, позивима и повезивању Bluetooth-а. Према Apple Developer Documentation, 2026, Audio Session се подешава кроз категорију и режим — без правилне конфигурације апликација можда неће репродуковати звук у позадини.

Главне ствари

  • Audio Session (AVAudioSession) — системски објекат iOS-а који управља аудио понашањем апликације на нивоу оперативног система.
  • Категорија сесије одређује основно понашање: playback, record, ambient, playAndRecord и друге.
  • Режими и опције прецизирају понашање: default, voiceChat, videoRecording, allowBluetooth.
  • При прекиду (позив, аларм) сесија добија обавештење преко NotificationCenter са типом interruptionType.
  • За репродукцију у позадини потребно је активирати Background Modes — Audio, AirPlay and Picture in Picture.

Шта је Audio Session?

Audio Session — је јединствена инстанца AVAudioSession коју креира систем при покретању апликације и постоји током целог њеног животног циклуса. Делује као посредник између апликације и аудио система iOS-а: подешавање категорије одређује да ли апликација може да репродукује звук у позадини, да ли ће звук бити пригушен при позиву и на које уређаје ће се аудио изводити.

За разлику од Android Audio Focus-а, где свака апликација независно захтева и ослобађа фокус, iOS Audio Session се централизовано управља кроз једну сесију по апликацији. При активацији сесије, систем аутоматски деактивира сесију претходне апликације, шаљући јој обавештење о прекиду. Ова архитектонска разлика одређује другачији приступ обради звука на две платформе.

Према WWDC 2024 Session 211, око 40% проблема са звуком у iOS апликацијама је узроковано неправилном конфигурацијом Audio Session-а. Најчешћа грешка — избор категорије ambient уместо playback, због чега звук нестаје при закључавању екрана.

Принцип рада AVAudioSession-а

При покретању, апликација добија sharedInstance сесије, поставља категорију кроз позив setCategory(_:mode:options:) и активира сесију кроз setActive(true). Након активације, iOS узима у обзир политике категорије за рутирање. Ако друга апликација активира своју сесију, тренутна добија обавештење AudioSessionInterruptionType.began путем Notification.Name.AVAudioSessionInterruption.

Категорије Audio Session-а

Категорија — главни параметар Audio Session-а, који одређује шест предефинисаних варијанти понашања. Избор категорије је прва и најважнија одлука при конфигурацији звука у iOS-у.

КатегоријаКада користитиПозадински аудиоПригушење при mute
ambientИгрице, позадински ефектиНеДа
playbackМузика, подкасти, аудиокњигеДаНе
recordДиктафон, снимање звукаНеН/П
playAndRecordVoIP, гласовне порукеДаНе
multiRouteDJ миксери, караокеДаНе
soloAmbientПодразумевано (iOS default)НеДа

Категорија playback — главни избор за плејере

За музичке и видео плејере увек користите playback. Ова категорија омогућава: репродукцију звука при закључаном екрану, при искљученом mute прекидачу (физичко дугме на кућишту iPhone-а) и при минимизираној апликацији. Без категорије playback, сесија се деактивира при закључавању екрана или минимизирању апликације.

Категорија ambient је погодна за игрице и апликације са позадинским звуцима — омогућава другим апликацијама да наставе репродукцију. На пример, ако корисник слуша музику и отвара игрицу са ambient сесијом, музика наставља да свира преко звукова игрице. Ово је фундаментална разлика у односу на Android, где такав сценарио захтева експлицитну дозволу duck.

Како подесити Audio Session

Конфигурација Audio Session-а треба да се изврши пре почетка било које репродукције. Препоручује се подешавање сесије у методи application(_:didFinishLaunchingWithOptions:) или у иницијализатору плејера. Након подешавања категорије, сесију је потребно активирати.

Основно подешавање Audio Session-а у Swift-у

swift
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 слушалице — без ње звук може да се изводи на уграђени звучник чак и када су слушалице повезане.

Подешавање за снимање и репродукцију (VoIP)

swift
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 и поновити активацију.

Режими и политике Audio Session-а

Режим (mode) прецизира категорију и оптимизује аудио пут за одређени тип употребе. Сваки режим мења понашање AGC-а, поништавања еха и кодека. Режими не замењују категорију, већ је допуњују — једна категорија може да ради са различитим режимима.

  • default — стандардни режим за музику и видео. AGC искључен, поништавање еха минимално.
  • voiceChat — оптимизација за VoIP. Укључује поништавање еха, AGC, смањење шума. Користите са категоријом playAndRecord.
  • videoRecording — за снимање видеа. Приоритет квалитета снимка над репродукцијом. Користите са категоријом record или playAndRecord.
  • measurement — за аудио мерења. Минимална обрада сигнала, без AGC-а или поништавања еха.
  • gameChat — за гласовни ћаскање у играма. Слично voiceChat-у, али са приоритетом звука игре.
  • moviePlayback — за гледање филмова. Оптимизација за вишеканални аудио (5.1, 7.1) и Dolby Atmos.

Опције категорије Audio Session-а

Опције пружају фино подешавање понашања сесије. Свака опција је заставица која се комбинује са другима у низу. На пример, [.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.

Претплата на обавештења о прекидима

swift
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-у.

Рутирање звука и Bluetooth

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-а?

Кључна разлика — архитектура. Audio Session је једна централизована сесија по апликацији, која се подешава једном. Audio Focus у Android-у захтева ручно захтевање фокуса сваки пут при репродукцији. Поред тога, iOS подржава миксовање кроз опцију mixWithOthers, док је у Android-у duck једина алтернатива потпуном заустављању.

Зашто звук нестаје при закључавању екрана iPhone-а?

Најчешћи узрок — неправилна категорија Audio Session-а. Ако је изабрана ambient или soloAmbient, звук се зауставља при закључавању екрана. Промените категорију на playback и уверите се да је у Info.plist додат Background Modes — Audio, AirPlay, and Picture in Picture.

Како дозволити двема апликацијама да истовремено пуштају звук у iOS-у?

Додајте опцију .mixWithOthers у setCategory. Ово ће омогућити миксовање звука ваше апликације са другим активним сесијама. Без ове опције, нова апликација прекида тренутну. MixWithOthers — еквивалент duck режима у Android-у, али са потпуним очувањем јачине звука.

Како програмски пребацити звук на Bluetooth звучник?

Користите overrideOutputAudioPort са nil за аутоматски избор. За принудни излаз на Bluetooth: узмите AVAudioSessionRouteDescription из availableOutputs, изаберите порт са типом .bluetoothA2DP и проследите га overrideOutputAudioPort-у. Уверите се да је сесија подешена са allowBluetooth.

Да ли треба позвати setActive(false) при паузирању плејера?

За већину апликација — да. Деактивација сесије при паузи омогућава другим апликацијама да добију аудио фокус. Изузетак — музички плејери са дуготрајном позадинском репродукцијом. Ако је пауза кратка (мање од 5 секунди), боље је оставити сесију активном за брзи наставак.

Закључак

  • Audio Session (AVAudioSession) — јединствена аудио сесија по апликацији у iOS-у, која управља понашањем звука на нивоу оперативног система.
  • Шест категорија: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — одређују основно аудио понашање.
  • За репродукцију у позадини обавезни су категорија playback и Background Modes у Info.plist-у.
  • Прекиди се обрађују кроз NotificationCenter са типовима began (пауза) и ended (наставак при shouldResume).
  • Опција .mixWithOthers укључује миксовање звука са другим апликацијама без прекидања.
  • Рутирање се управља аутоматски, али се прати кроз routeChangeNotification за паузирање при искључивању слушалица.
  • Категорија playAndRecord са режимом voiceChat — стандард за VoIP апликације са поништавањем еха и AGC-ом.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође