Audio Session — centrální mechanismus iOS pro řízení audio chování aplikace: interakce se systémem, zpracování přerušení a směrování zvuku. Každá iOS aplikace získá jedinou audio relaci, která určuje, jak se zvuk chová při uzamčení obrazovky, hovorech a připojení Bluetooth. Podle Apple Developer Documentation, 2026 se Audio Session konfiguruje pomocí kategorie a režimu — bez správné konfigurace aplikace nemusí přehrávat zvuk na pozadí.
Hlavní body
Audio Session — je jediná instance AVAudioSession, kterou vytvoří systém při spuštění aplikace a existuje po celý její životní cyklus. Funguje jako prostředník mezi aplikací a audio systémem iOS: konfigurace kategorie určuje, zda aplikace může přehrávat zvuk na pozadí, zda bude zvuk tlumen během hovoru a na která zařízení bude audio výstup směrován.
Na rozdíl od Android Audio Focus, kde každá aplikace nezávisle požaduje a uvolňuje fokus, je iOS Audio Session centrálně spravována prostřednictvím jedné relace na aplikaci. Při aktivaci relace systém automaticky deaktivuje relaci předchozí aplikace a odešle jí oznámení o přerušení. Tento architektonický rozdíl určuje odlišný přístup ke zpracování zvuku na obou platformách.
Podle WWDC 2024 Session 211 je přibližně 40% problémů se zvukem v iOS aplikacích způsobeno nesprávnou konfigurací Audio Session. Nejčastější chyba — výběr kategorie ambient místo playback, což způsobuje ztrátu zvuku při uzamčení obrazovky.
Při spuštění aplikace získá sharedInstance relace, nastaví kategorii pomocí volání setCategory(_:mode:options:) a aktivuje relaci pomocí setActive(true). Po aktivaci iOS zohledňuje pravidla kategorie pro směrování. Pokud jiná aplikace aktivuje svou relaci, aktuální obdrží oznámení AudioSessionInterruptionType.began prostřednictvím Notification.Name.AVAudioSessionInterruption.
Kategorie — hlavní parametr Audio Session, který určuje šest předdefinovaných variant chování. Výběr kategorie je první a nejdůležitější rozhodnutí při konfiguraci audia v iOS.
| Kategorie | Kdy použít | Audio na pozadí | Ztlumení při mute |
|---|---|---|---|
| ambient | Hry, efekty na pozadí | Ne | Ano |
| playback | Hudba, podcasty, audioknihy | Ano | Ne |
| record | Diktafon, nahrávání zvuku | Ne | N/A |
| playAndRecord | VoIP, hlasové zprávy | Ano | Ne |
| multiRoute | DJ mixery, karaoke | Ano | Ne |
| soloAmbient | Výchozí (iOS default) | Ne | Ano |
Pro hudební a video přehrávače vždy používejte playback. Tato kategorie umožňuje: přehrávání zvuku při zamčené obrazovce, při vypnutém vypínači mute (fyzické tlačítko na těle iPhonu) a při minimalizované aplikaci. Bez kategorie playback se relace deaktivuje při uzamčení obrazovky nebo minimalizaci aplikace.
Kategorie ambient je vhodná pro hry a aplikace se zvuky na pozadí — umožňuje ostatním aplikacím pokračovat v přehrávání. Například, pokud uživatel poslouchá hudbu a otevře hru s ambient relací, hudba nadále hraje přes zvuky hry. To je zásadní rozdíl oproti Androidu, kde takový scénář vyžaduje výslovné povolení duck.
Konfigurace Audio Session by měla být provedena před zahájením jakéhokoli přehrávání. Doporučuje se konfigurovat relaci v metodě application(_:didFinishLaunchingWithOptions:) nebo v inicializátoru přehrávače. Po konfiguraci kategorie je třeba relaci aktivovat.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Nastavení Audio Session selhalo: \(error.localizedDescription)")
}
Parametr options zahrnuje allowBluetooth (výstup na Bluetooth sluchátka) a defaultToSpeaker (přehrávání přes reproduktor, nikoli přes sluchátko). Volba allowBluetooth je povinná pro aplikace podporující Bluetooth sluchátka — bez ní může být zvuk vyveden přes vestavěný reproduktor, i když jsou sluchátka připojena.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
Kategorie playAndRecord s režimem voiceChat optimalizuje audio cestu pro hlasovou komunikaci: zahrnuje potlačení ozvěny, automatické řízení zesílení (AGC) a výběr optimálního kodeku. OverrideOutputAudioPort(.speaker) vynutí výstup přes reproduktor, i když jsou sluchátka připojena — užitečné pro handsfree hovory.
Volání setActive(true) aktivuje relaci a informuje systém, že aplikace bude používat audio. Při pozastavení přehrávání se doporučuje relaci deaktivovat, aby ostatní aplikace mohly získat audio stream. Výjimka — aplikace s dlouhodobým přehráváním na pozadí (hudba, podcasty), kde relace zůstává aktivní po celou skladbu.
Je důležité zpracovávat chyby při setActive. Pokud je aktivní jiná relace s vysokou prioritou (např. Telefon během hovoru), může setActive vyvolat chybu. V takovém případě je třeba počkat na oznámení AudioSessionInterruptionType.ended a opakovat aktivaci.
Režim (mode) upřesňuje kategorii a optimalizuje audio cestu pro konkrétní typ použití. Každý režim mění chování AGC, potlačení ozvěny a kodeků. Režimy nenahrazují kategorii, ale doplňují ji — jedna kategorie může pracovat s různými režimy.
Volby poskytují jemné doladění chování relace. Každá volba je příznak, který se kombinuje s ostatními v poli. Například [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] umožňuje výstup zvuku na Bluetooth sluchátka, použití reproduktoru ve výchozím nastavení a míchání s audioknihami.
V iOS 17+ se objevila volba spatialAudio, která aktivuje personalizovaný prostorový zvuk pro AirPods prostřednictvím AVAudioSessionSpatialPreferences. Podle WWDC 2024 zvyšuje prostorový zvuk zapojení uživatelů hudebních aplikací o 25% v testech Apple.
Přerušení (interruptions) — klíčový rozdíl mezi Audio Session a Android Audio Focus. V iOS jsou přerušení zpracovávána prostřednictvím NotificationCenter odběrem AVAudioSession.interruptionNotification. Oznámení obsahuje slovník s typem přerušení: began nebo 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()
}
}
Při obdržení interruptionType.began by měl přehrávač pozastavit přehrávání. Při interruptionType.ended vlastnost interruptionOptionKey indikuje, zda může přehrávač automaticky obnovit (shouldResume). Pokud uživatel ukončil hovor, shouldResume = true. Pokud hovor skončil kvůli timeoutu — shouldResume = false, obnovení není povoleno.
Když jiná aplikace aktivuje svou Audio Session s kategorií playback, aktuální relace obdrží oznámení o přerušení. Pokud jiná aplikace používá ambient, k přerušení nedochází — zvuky se míchají. Toto chování se zásadně liší od Androidu, kde každá aktivace Audio Focus způsobuje událost LOSS.
Pro aplikace, které by měly pokračovat v přehrávání při aktivaci jiných relací (např. navigace při hrající hudbě), použijte volbu .mixWithOthers. Tato volba povoluje míchání zvuku s jinými aplikacemi a přerušení se neodesílají. MixWithOthers — iOS ekvivalent duck režimu v Androidu.
Audio Session automaticky spravuje směrování zvuku mezi vestavěnými reproduktory, sluchátky, Bluetooth sluchátky a AirPlay zařízeními. Aplikace může sledovat aktuální trasu pomocí vlastnosti currentRoute a přijímat oznámení o změnách prostřednictvím AVAudioSession.routeChangeNotification.
Při připojení Bluetooth sluchátek iOS automaticky přepne audio výstup na ně, pokud je relace nakonfigurována s volbou allowBluetooth. Bez této volby zvuk nadále proudí přes vestavěný reproduktor. Od iOS 16 při připojení AirPods Pro systém automaticky zapíná ProMotion synchronizaci pro snížení latence.
Odběr routeChangeNotification umožňuje reagovat na připojení a odpojení sluchátek. Při odpojení Bluetooth sluchátek by měl přehrávač pozastavit přehrávání — uživatel nemusí očekávat, že zvuk začne hrát z telefonního reproduktoru. Podle Apple HIG (2026) je to povinné chování pro hudební aplikace.
Vlastnosti availableInputs a availableOutputs vracejí seznam dostupných audio zařízení s jejich typy (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Vývojář může programově vybrat konkrétní zařízení pomocí overrideOutputAudioPort pro vlastní scénáře směrování.
Často kladené otázky
Klíčový rozdíl — architektura. Audio Session je jedna centralizovaná relace na aplikaci, která se konfiguruje jednou. Audio Focus v Androidu vyžaduje ruční žádost o fokus při každém přehrávání. Kromě toho iOS podporuje míchání pomocí volby mixWithOthers, zatímco v Androidu je duck jedinou alternativou k úplnému zastavení.
Nejčastější příčina — nesprávná kategorie Audio Session. Pokud je zvolena ambient nebo soloAmbient, zvuk se při uzamčení obrazovky zastaví. Přepněte kategorii na playback a ujistěte se, že v Info.plist je přidán Background Modes — Audio, AirPlay, and Picture in Picture.
Přidejte volbu .mixWithOthers do setCategory. To umožní míchání zvuku vaší aplikace s ostatními aktivními relacemi. Bez této volby nová aplikace přeruší stávající. MixWithOthers — ekvivalent duck režimu v Androidu, ale s plným zachováním hlasitosti.
Použijte overrideOutputAudioPort s nil pro automatický výběr. Pro vynucený výstup na Bluetooth: získejte AVAudioSessionRouteDescription z availableOutputs, vyberte port s typem .bluetoothA2DP a předejte jej overrideOutputAudioPort. Ujistěte se, že relace je nakonfigurována s allowBluetooth.
Pro většinu aplikací — ano. Deaktivace relace při pozastavení umožňuje ostatním aplikacím získat audio fokus. Výjimka — hudební přehrávače s dlouhodobým přehráváním na pozadí. Pokud je pauza krátká (méně než 5 sekund), je lepší nechat relaci aktivní pro rychlé obnovení.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také