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("Настройката Audio Session не успя: \(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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също