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 — 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.
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.
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.
| Kategoria | Kiedy używać | Audio w tle | Wyciszenie przy mute |
|---|---|---|---|
| ambient | Gry, efekty tła | Nie | Tak |
| playback | Muzyka, podcasty, audiobooki | Tak | Nie |
| record | Dyktafon, nagrywanie dźwięku | Nie | N/D |
| playAndRecord | VoIP, wiadomości głosowe | Tak | Nie |
| multiRoute | Mikser DJ-ski, karaoke | Tak | Nie |
| soloAmbient | Domyślnie (iOS default) | Nie | Tak |
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.
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ć.
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.
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.
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ę.
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.
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.
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.
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ć.
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.
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.
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
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.
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.
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.
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.
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
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.
Przeczytaj również