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

Обсудить проект

Читайте также