Audio Session — co to jest, kategorie i konfiguracja w iOS

Autor: IT Sectr Opublikowano: 2026-05-24 Czas czytania: 8 min

Audio Session — centralny mechanizm iOS do zarządzania zachowaniem audio aplikacji: interakcja z systemem, obsługa przerwań i routing dźwięku. Każda aplikacja iOS otrzymuje pojedynczą sesję audio, która określa, jak dźwięk zachowuje się przy blokadzie ekranu, podczas połączeń i podłączenia Bluetooth. Według Apple Developer Documentation, 2026, Audio Session jest konfigurowana przez kategorię i tryb — bez prawidłowej konfiguracji aplikacja może nie odtwarzać dźwięku w tle.

Najważniejsze

  • Audio Session (AVAudioSession) — systemowy obiekt iOS zarządzający zachowaniem audio aplikacji na poziomie systemu operacyjnego.
  • Kategoria sesji określa podstawowe zachowanie: playback, record, ambient, playAndRecord i inne.
  • Tryby i opcje precyzują zachowanie: default, voiceChat, videoRecording, allowBluetooth.
  • W przypadku przerwania (połączenie, alarm) sesja otrzymuje powiadomienie przez NotificationCenter z typem interruptionType.
  • Do odtwarzania w tle konieczne jest aktywowanie Background Modes — Audio, AirPlay and Picture in Picture.

Co to jest Audio Session?

Audio Session — to pojedyncza instancja AVAudioSession, która jest tworzona przez system przy uruchomieniu aplikacji i istnieje przez cały jej cykl życia. Działa jako pośrednik między aplikacją a systemem audio iOS: konfiguracja kategorii określa, czy aplikacja może odtwarzać dźwięk w tle, czy dźwięk będzie wyciszany podczas połączenia i na jakie urządzenia wyprowadzać audio.

W przeciwieństwie do Android Audio Focus, gdzie każda aplikacja niezależnie żąda i zwalnia fokus, iOS Audio Session jest zarządzana centralnie przez jedną sesję na aplikację. Po aktywacji sesji system automatycznie deaktywuje sesję poprzedniej aplikacji, wysyłając jej powiadomienie o przerwaniu. Ta różnica architektoniczna determinuje odmienne podejście do obsługi audio na obu platformach.

Według WWDC 2024 Session 211, około 40% problemów z audio w aplikacjach iOS jest spowodowanych nieprawidłową konfiguracją Audio Session. Najczęstszym błędem jest wybór kategorii ambient zamiast playback, przez co dźwięk znika przy blokadzie ekranu.

Zasada działania AVAudioSession

Po uruchomieniu aplikacja otrzymuje sharedInstance sesji, ustawia kategorię przez wywołanie setCategory(_:mode:options:) i aktywuje sesję przez setActive(true). Po aktywacji iOS uwzględnia polityki kategorii do routingu. Jeśli inna aplikacja aktywuje swoją sesję, bieżąca otrzymuje powiadomienie AudioSessionInterruptionType.began przez Notification.Name.AVAudioSessionInterruption.

Kategorie Audio Session

Kategoria — główny parametr Audio Session, określający sześć predefiniowanych wariantów zachowania. Wybór kategorii to pierwsza i najważniejsza decyzja przy konfiguracji audio w iOS.

KategoriaKiedy używaćAudio w tleWyciszenie przy mute
ambientGry, efekty tłaNieTak
playbackMuzyka, podcasty, audiobookiTakNie
recordDyktafon, nagrywanie dźwiękuNieN/D
playAndRecordVoIP, wiadomości głosoweTakNie
multiRouteMikser DJ-ski, karaokeTakNie
soloAmbientDomyślnie (iOS default)NieTak

Kategoria playback — główny wybór dla odtwarzaczy

Dla odtwarzaczy muzycznych i wideo zawsze używaj playback. Ta kategoria pozwala: odtwarzać dźwięk przy zablokowanym ekranie, przy wyłączonym przełączniku mute (fizyczny przycisk na obudowie iPhone) i przy zminimalizowanej aplikacji. Bez kategorii playback sesja deaktywuje się przy blokadzie ekranu lub minimalizacji aplikacji.

Kategoria ambient jest odpowiednia dla gier i aplikacji z dźwiękami tła — pozwala innym aplikacjom kontynuować odtwarzanie. Na przykład, jeśli użytkownik słucha muzyki i otwiera grę z sesją ambient, muzyka nadal gra w tle dźwięków gry. To zasadnicza różnica w stosunku do Androida, gdzie taki scenariusz wymaga jawnego zezwolenia duck.

Jak skonfigurować Audio Session

Konfiguracja Audio Session powinna być wykonana przed rozpoczęciem jakiegokolwiek odtwarzania. Zaleca się konfigurowanie sesji w metodzie application(_:didFinishLaunchingWithOptions:) lub w inicjalizatorze odtwarzacza. Po skonfigurowaniu kategorii sesję należy aktywować.

Podstawowa konfiguracja Audio Session w Swift

swift
import AVFAudio

let session = AVAudioSession.sharedInstance

do {
    try session.setCategory(
        playback,
        mode: default,
        options: [allowBluetooth, defaultToSpeaker]
    )
    try session.setActive(true)
} catch {
    print("Konfiguracja Audio Session nie powiodła się: \(error.localizedDescription)")
}

Parametr options obejmuje allowBluetooth (wyjście na zestaw słuchawkowy Bluetooth) i defaultToSpeaker (odtwarzanie przez głośnik, a nie słuchawkowy). Opcja allowBluetooth jest obowiązkowa dla aplikacji obsługujących słuchawki Bluetooth — bez niej dźwięk może być wyprowadzany na wbudowany głośnik nawet przy podłączonym zestawie słuchawkowym.

Konfiguracja do nagrywania i odtwarzania (VoIP)

swift
let session = AVAudioSession.sharedInstance
try session.setCategory(
    playAndRecord,
    mode: voiceChat,
    options: [allowBluetooth, allowBluetoothA2DP]
)

try session.overrideOutputAudioPort(speaker)
try session.setActive(true)

Kategoria playAndRecord z trybem voiceChat optymalizuje tor audio dla komunikacji głosowej: włącza tłumienie echa, automatyczną regulację wzmocnienia (AGC) i wybiera optymalny kodek. OverrideOutputAudioPort(.speaker) wymusza wyjście przez głośnik nawet przy podłączonym zestawie słuchawkowym — przydatne do głośnomówiących.

Aktywacja i deaktywacja sesji

Wywołanie setActive(true) aktywuje sesję i powiadamia system, że aplikacja będzie używać audio. Przy wstrzymaniu odtwarzania zaleca się deaktywację sesji, aby inne aplikacje mogły uzyskać strumień audio. Wyjątek — aplikacje z długotrwałym odtwarzaniem w tle (muzyka, podcasty), gdzie sesja pozostaje aktywna przez cały utwór.

Ważne jest obsługiwanie błędów przy setActive. Jeśli inna sesja o wysokim priorytecie jest aktywna (np. Telefon podczas połączenia), setActive może zgłosić błąd. W takim przypadku należy poczekać na powiadomienie AudioSessionInterruptionType.ended i ponowić aktywację.

Tryby i polityki Audio Session

Tryb (mode) precyzuje kategorię i optymalizuje tor audio dla konkretnego typu użycia. Każdy tryb zmienia zachowanie AGC, tłumienia echa i kodeków. Tryby nie zastępują kategorii, ale ją uzupełniają — jedna kategoria może działać z różnymi trybami.

  • default — standardowy tryb dla muzyki i wideo. AGC wyłączone, tłumienie echa minimalne.
  • voiceChat — optymalizacja dla VoIP. Włącza tłumienie echa, AGC, redukcję szumów. Używaj z kategorią playAndRecord.
  • videoRecording — do nagrywania wideo. Priorytet jakości nagrania nad odtwarzaniem. Używaj z kategorią record lub playAndRecord.
  • measurement — do pomiarów audio. Minimalne przetwarzanie sygnału, żadnego AGC ani tłumienia echa.
  • gameChat — do czatu głosowego w grach. Podobny do voiceChat, ale z priorytetem dźwięku gry.
  • moviePlayback — do oglądania filmów. Optymalizacja dla dźwięku wielokanałowego (5.1, 7.1) i Dolby Atmos.

Opcje kategorii Audio Session

Opcje zapewniają precyzyjne dostrojenie zachowania sesji. Każda opcja to flaga, którą można łączyć z innymi w tablicy. Na przykład, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] pozwala wyprowadzać dźwięk na zestaw słuchawkowy Bluetooth, używać głośnika domyślnie i miksować z audiobookami.

W iOS 17+ pojawiła się opcja spatialAudio, która włącza spersonalizowany dźwięk przestrzenny dla AirPods przez AVAudioSessionSpatialPreferences. Według WWDC 2024, dźwięk przestrzenny zwiększa zaangażowanie użytkowników aplikacji muzycznych o 25% w testach Apple.

Obsługa przerwań i połączeń

Przerwania (interruptions) — kluczowa różnica między Audio Session a Android Audio Focus. W iOS przerwania są obsługiwane przez NotificationCenter poprzez subskrypcję AVAudioSession.interruptionNotification. Powiadomienie zawiera słownik z typem przerwania: began lub ended.

Subskrypcja powiadomień o przerwaniach

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()
        }
    }

Po otrzymaniu interruptionType.began odtwarzacz powinien wstrzymać odtwarzanie. Przy interruptionType.ended właściwość interruptionOptionKey wskazuje, czy odtwarzacz może automatycznie wznowić (shouldResume). Jeśli użytkownik zakończył połączenie, flaga shouldResume = true. Jeśli połączenie zakończyło się timeoutem — shouldResume = false, nie można wznawiać.

Obsługa przerwań od innych aplikacji

Gdy inna aplikacja aktywuje swoją Audio Session z kategorią playback, bieżąca sesja otrzymuje powiadomienie o przerwaniu. Jeśli inna aplikacja używa ambient, przerwanie nie występuje — dźwięki są miksowane. To zachowanie radykalnie różni się od Androida, gdzie każda aktywacja Audio Focus powoduje zdarzenie LOSS.

Dla aplikacji, które powinny kontynuować odtwarzanie przy aktywacji innych sesji (np. nawigacja przy grającej muzyce), używaj opcji .mixWithOthers. Ta opcja zezwala na miksowanie dźwięku z innymi aplikacjami, a przerwania nie są wysyłane. MixWithOthers — iOS-owy odpowiednik trybu duck w Androidzie.

Routing dźwięku i Bluetooth

Audio Session automatycznie zarządza routingiem dźwięku między wbudowanymi głośnikami, słuchawkami, zestawami słuchawkowymi Bluetooth i urządzeniami AirPlay. Aplikacja może śledzić bieżącą trasę przez właściwość currentRoute i otrzymywać powiadomienia o zmianach przez AVAudioSession.routeChangeNotification.

Po podłączeniu słuchawek Bluetooth iOS automatycznie przełącza wyjście audio na nie, jeśli sesja jest skonfigurowana z opcją allowBluetooth. Bez tej opcji dźwięk nadal płynie przez wbudowany głośnik. Począwszy od iOS 16, po podłączeniu AirPods Pro system automatycznie włącza synchronizację ProMotion w celu zmniejszenia opóźnienia.

Monitorowanie zmiany trasy

Subskrypcja routeChangeNotification pozwala reagować na podłączanie i odłączanie słuchawek. Po odłączeniu zestawu słuchawkowego Bluetooth odtwarzacz powinien wstrzymać odtwarzanie — użytkownik mógł nie oczekiwać, że dźwięk zacznie grać z głośnika telefonu. Według Apple HIG (2026), jest to obowiązkowe zachowanie dla aplikacji muzycznych.

Właściwości availableInputs i availableOutputs zwracają listę dostępnych urządzeń audio z ich typami (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Deweloper może programowo wybrać konkretne urządzenie przez overrideOutputAudioPort dla niestandardowych scenariuszy routingu.

Często zadawane pytania

Czym Audio Session różni się od Android Audio Focus?

Kluczowa różnica — architektura. Audio Session to jedna scentralizowana sesja na aplikację, która jest konfigurowana raz. Audio Focus w Android wymaga ręcznego żądania fokusu za każdym razem przy odtwarzaniu. Ponadto iOS obsługuje miksowanie przez opcję mixWithOthers, a w Android duck jest jedyną alternatywą dla całkowitego zatrzymania.

Dlaczego dźwięk znika przy blokadzie ekranu iPhone?

Najczęstszą przyczyną jest nieprawidłowa kategoria Audio Session. Jeśli wybrano ambient lub soloAmbient, dźwięk zatrzymuje się przy blokadzie ekranu. Przełącz kategorię na playback i upewnij się, że w Info.plist dodano Background Modes — Audio, AirPlay, and Picture in Picture.

Jak pozwolić dwóm aplikacjom grać jednocześnie w iOS?

Dodaj opcję .mixWithOthers w setCategory. To pozwoli na miksowanie dźwięku twojej aplikacji z innymi aktywnymi sesjami. Bez tej opcji nowa aplikacja przerywa bieżącą. MixWithOthers — odpowiednik trybu duck w Androidzie, ale z pełnym zachowaniem głośności.

Jak programowo przełączyć dźwięk na głośnik Bluetooth?

Użyj overrideOutputAudioPort z nil dla automatycznego wyboru. Do wymuszonego wyjścia na Bluetooth: pobierz AVAudioSessionRouteDescription z availableOutputs, wybierz port z typem .bluetoothA2DP i przekaż go do overrideOutputAudioPort. Upewnij się, że sesja jest skonfigurowana z allowBluetooth.

Czy trzeba wywoływać setActive(false) przy wstrzymaniu odtwarzacza?

Dla większości aplikacji — tak. Deaktywacja sesji przy wstrzymaniu pozwala innym aplikacjom uzyskać fokus audio. Wyjątek — odtwarzacze muzyczne z długotrwałym odtwarzaniem w tle. Jeśli pauza jest krótka (mniej niż 5 sekund), lepiej pozostawić sesję aktywną dla szybkiego wznowienia.

Podsumowanie

  • Audio Session (AVAudioSession) — pojedyncza sesja audio na aplikację w iOS, zarządzająca zachowaniem dźwięku na poziomie systemu operacyjnego.
  • Sześć kategorii: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — określa podstawowe zachowanie audio.
  • Do odtwarzania w tle wymagane są kategoria playback i Background Modes w Info.plist.
  • Przerwania są obsługiwane przez NotificationCenter z typami began (pauza) i ended (wznowienie przy shouldResume).
  • Opcja .mixWithOthers włącza miksowanie dźwięku z innymi aplikacjami bez przerywania.
  • Routing jest zarządzany automatycznie, ale monitorowany przez routeChangeNotification w celu wstrzymania przy odłączeniu słuchawek.
  • Kategoria playAndRecord z trybem voiceChat — standard dla aplikacji VoIP z tłumieniem echa i AGC.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również