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("Настройката 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)
Категорията 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също