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

Обговорити проект

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