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 setup failed: \(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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также