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. Якщо інша сесія з високим пріоритетом активна (наприклад, Phone при дзвінку), 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також