Audio Session — az iOS központi mechanizmusa az alkalmazás audió viselkedésének kezelésére: rendszerrel való interakció, megszakítások kezelése és hang útvonalválasztása. Minden iOS-alkalmazás egyetlen audió munkamenetet kap, amely meghatározza, hogyan viselkedik a hang a képernyő lezárásakor, hívások alatt és Bluetooth csatlakoztatásakor. A Apple Developer Documentation, 2026 szerint az Audio Session kategórián és módón keresztül kerül konfigurálásra — helyes konfiguráció nélkül az alkalmazás nem biztos, hogy hangot játszik le a háttérben.
Főbb pontok
Audio Session — egyetlen AVAudioSession példány, amelyet a rendszer hoz létre az alkalmazás indításakor, és a teljes életciklusa alatt létezik. Közvetítőként működik az alkalmazás és az iOS audió rendszere között: a kategória konfigurációja határozza meg, hogy az alkalmazás játszhat-e le hangot a háttérben, hogy a hang elnémul-e hívás közben, és hogy mely eszközökre kerüljön ki az audió.
Ellentétben az Android Audio Focus-szal, ahol minden alkalmazás függetlenül kéri és engedi el a fókuszt, az iOS Audio Session központilag kezelt egyetlen munkameneten keresztül alkalmazásonként. A munkamenet aktiválásakor a rendszer automatikusan deaktiválja az előző alkalmazás munkamenetét, megszakítási értesítést küldve neki. Ez az építészeti különbség határozza meg a hangkezelés eltérő megközelítését a két platformon.
A WWDC 2024 Session 211 szerint az iOS-alkalmazások audió problémáinak körülbelül 40%-át az Audio Session helytelen konfigurációja okozza. A leggyakoribb hiba — az ambient kategória választása a playback helyett, ami miatt a hang eltűnik a képernyő lezárásakor.
Indításkor az alkalmazás megkapja a munkamenet sharedInstance-jét, beállítja a kategóriát a setCategory(_:mode:options:) híváson keresztül, és aktiválja a munkamenetet a setActive(true) segítségével. Az aktiválás után az iOS figyelembe veszi a kategória irányelveit az útvonalválasztáshoz. Ha egy másik alkalmazás aktiválja a saját munkamenetét, a jelenlegi értesítést kap az AudioSessionInterruptionType.began-ról a Notification.Name.AVAudioSessionInterruption segítségével.
Kategória — az Audio Session fő paramétere, amely hat előre meghatározott viselkedési változatot határoz meg. A kategória kiválasztása az első és legfontosabb döntés az audió konfigurálásakor iOS-ben.
| Kategória | Mikor használjuk | Háttér audió | Némítás mute-nál |
|---|---|---|---|
| ambient | Játékok, háttér effektek | Nem | Igen |
| playback | Zene, podcastok, hangoskönyvek | Igen | Nem |
| record | Diktafon, hangfelvétel | Nem | N/A |
| playAndRecord | VoIP, hangüzenetek | Igen | Nem |
| multiRoute | DJ keverők, karaoke | Igen | Nem |
| soloAmbient | Alapértelmezett (iOS default) | Nem | Igen |
Zenei és videó lejátszókhoz mindig a playback kategóriát használja. Ez a kategória lehetővé teszi: hang lejátszását zárt képernyővel, kikapcsolt néma kapcsolóval (fizikai gomb az iPhone házán) és minimalizált alkalmazással. A playback kategória nélkül a munkamenet deaktiválódik a képernyő lezárásakor vagy az alkalmazás minimalizálásakor.
Az ambient kategória játékokhoz és háttérhangokkal rendelkező alkalmazásokhoz alkalmas — lehetővé teszi más alkalmazások számára a lejátszás folytatását. Például, ha a felhasználó zenét hallgat és megnyit egy játékot ambient munkamenettel, a zene tovább szól a játék hangjai felett. Ez alapvető különbség az Androidhoz képest, ahol egy ilyen forgatókönyv explicit duck engedélyt igényel.
Az Audio Session konfigurálását minden lejátszás megkezdése előtt el kell végezni. Javasolt a munkamenet konfigurálása a application(_:didFinishLaunchingWithOptions:) metódusban vagy a lejátszó inicializálójában. A kategória konfigurálása után a munkamenetet aktiválni kell.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Az Audio Session beállítása sikertelen: \(error.localizedDescription)")
}
Az options paraméter tartalmazza az allowBluetooth (kimenet Bluetooth fejhallgatóra) és a defaultToSpeaker (lejátszás hangszórón keresztül, nem a fülhallgatón) opciókat. Az allowBluetooth opció kötelező a Bluetooth fejhallgatókat támogató alkalmazások számára — enélkül a hang a beépített hangszórón keresztül is kiadódhat, még csatlakoztatott fejhallgató esetén is.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
A playAndRecord kategória a voiceChat móddal optimalizálja az audió útvonalat hangkommunikációhoz: tartalmazza a visszhang elnyomást, automatikus erősítés szabályozást (AGC) és az optimális kodek kiválasztását. Az OverrideOutputAudioPort(.speaker) kikényszeríti a kimenetet a hangszórón keresztül még csatlakoztatott fejhallgató esetén is — hasznos kihangosított beszélgetésekhez.
A setActive(true) hívás aktiválja a munkamenetet és értesíti a rendszert, hogy az alkalmazás audiót fog használni. A lejátszás szüneteltetésekor javasolt a munkamenet deaktiválása, hogy más alkalmazások hozzáférhessenek az audió adatfolyamhoz. Kivétel — hosszú háttérlejátszással rendelkező alkalmazások (zene, podcastok), ahol a munkamenet a teljes szám alatt aktív marad.
Fontos a hibák kezelése a setActive során. Ha egy másik magas prioritású munkamenet aktív (pl. Telefon hívás közben), a setActive hibát dobhat. Ebben az esetben meg kell várni az AudioSessionInterruptionType.ended értesítést, és meg kell ismételni az aktiválást.
A mód (mode) pontosítja a kategóriát és optimalizálja az audió útvonalat egy adott használati típushoz. Minden mód megváltoztatja az AGC, a visszhang elnyomás és a kodekek viselkedését. A módok nem helyettesítik a kategóriát, hanem kiegészítik azt — egy kategória különböző módokkal működhet.
Az opciók finomhangolást biztosítanak a munkamenet viselkedéséhez. Minden opció egy jelző, amely másokkal kombinálható egy tömbben. Például a [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] lehetővé teszi a hang Bluetooth fejhallgatóra történő kimenetét, a hangszóró alapértelmezett használatát és a hangoskönyvekkel való keverést.
Az iOS 17+ -ban megjelent a spatialAudio opció, amely személyre szabott térhangzást aktivál az AirPods-okhoz az AVAudioSessionSpatialPreferences segítségével. A WWDC 2024 szerint a térhangzás 25%-kal növeli a zenei alkalmazások felhasználóinak elkötelezettségét az Apple tesztekben.
Megszakítások (interruptions) — az Audio Session legfőbb különbsége az Android Audio Focus-szal szemben. Az iOS-ben a megszakítások a NotificationCenter segítségével kezelhetők az AVAudioSession.interruptionNotification-ra való feliratkozással. Az értesítés egy szótárt tartalmaz a megszakítás típusával: began vagy 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()
}
}
Az interruptionType.began fogadásakor a lejátszónak szüneteltetnie kell a lejátszást. Az interruptionType.ended esetén az interruptionOptionKey tulajdonság jelzi, hogy a lejátszó automatikusan folytathatja-e (shouldResume). Ha a felhasználó befejezte a hívást, shouldResume = true. Ha a hívás időtúllépés miatt ért véget — shouldResume = false, a folytatás nem engedélyezett.
Amikor egy másik alkalmazás aktiválja az Audio Session-jét a playback kategóriával, a jelenlegi munkamenet megszakítási értesítést kap. Ha a másik alkalmazás ambient-et használ, a megszakítás nem történik meg — a hangok keverednek. Ez a viselkedés gyökeresen különbözik az Androidtól, ahol minden Audio Focus aktiválás LOSS eseményt okoz.
Azoknál az alkalmazásoknál, amelyeknek folytatniuk kell a lejátszást más munkamenetek aktiválásakor (pl. navigáció zenelejátszás közben), használja a .mixWithOthers opciót. Ez az opció lehetővé teszi a hang keverését más alkalmazásokkal, és a megszakítások nem kerülnek elküldésre. A MixWithOthers — a duck mód iOS megfelelője Androidban.
Az Audio Session automatikusan kezeli a hang útvonalválasztását a beépített hangszórók, fejhallgatók, Bluetooth fejhallgatók és AirPlay eszközök között. Az alkalmazás nyomon követheti az aktuális útvonalat a currentRoute tulajdonság segítségével, és értesítéseket kaphat a változásokról az AVAudioSession.routeChangeNotification-on keresztül.
Bluetooth fejhallgató csatlakoztatásakor az iOS automatikusan átkapcsolja az audió kimenetet rájuk, ha a munkamenet az allowBluetooth opcióval van konfigurálva. Ezen opció nélkül a hang továbbra is a beépített hangszórón keresztül áramlik. Az iOS 16-tól kezdve az AirPods Pro csatlakoztatásakor a rendszer automatikusan bekapcsolja a ProMotion szinkronizációt a késleltetés csökkentése érdekében.
A routeChangeNotification-ra való feliratkozás lehetővé teszi a reakciót a fejhallgatók csatlakoztatására és leválasztására. A Bluetooth fejhallgató leválasztásakor a lejátszónak szüneteltetnie kell a lejátszást — a felhasználó nem biztos, hogy számít arra, hogy a hang a telefon hangszórójából kezd el szólni. Az Apple HIG (2026) szerint ez kötelező viselkedés a zenei alkalmazások számára.
Az availableInputs és availableOutputs tulajdonságok visszaadják a rendelkezésre álló audió eszközök listáját a típusukkal együtt (builtInSpeaker, headphones, bluetoothA2DP, hdmi). A fejlesztő programozottan kiválaszthat egy adott eszközt az overrideOutputAudioPort segítségével egyedi útvonalválasztási forgatókönyvekhez.
Gyakran ismételt kérdések
A legfőbb különbség — architektúra. Az Audio Session egy központosított munkamenet alkalmazásonként, amelyet egyszer kell konfigurálni. Az Android Audio Focus minden lejátszáskor kézi fókuszkérést igényel. Ezenkívül az iOS támogatja a keverést a mixWithOthers opcióval, míg Androidban a duck az egyetlen alternatíva a teljes leállításra.
A leggyakoribb ok — az Audio Session helytelen kategóriája. Ha az ambient vagy soloAmbient van kiválasztva, a hang leáll a képernyő lezárásakor. Váltsa át a kategóriát playback-re, és győződjön meg róla, hogy az Info.plist-ben hozzáadásra került a Background Modes — Audio, AirPlay, and Picture in Picture.
Adja hozzá a .mixWithOthers opciót a setCategory-hoz. Ez lehetővé teszi az Ön alkalmazása hangjának keverését más aktív munkamenetekkel. Ezen opció nélkül az új alkalmazás megszakítja a jelenlegit. A MixWithOthers — a duck mód iOS megfelelője Androidban, de a hangerő teljes megőrzésével.
Használja az overrideOutputAudioPort-ot nil értékkel az automatikus kiválasztáshoz. Kényszerített Bluetooth kimenethez: szerezze be az AVAudioSessionRouteDescription-t az availableOutputs-ból, válassza ki a .bluetoothA2DP típusú portot, és adja át az overrideOutputAudioPort-nak. Győződjön meg róla, hogy a munkamenet allowBluetooth opcióval van konfigurálva.
A legtöbb alkalmazás esetében — igen. A munkamenet deaktiválása szüneteltetéskor lehetővé teszi más alkalmazások számára az audió fókusz megszerzését. Kivétel — zenei lejátszók hosszú háttérlejátszással. Ha a szünet rövid (kevesebb mint 5 másodperc), jobb a munkamenetet aktívan hagyni a gyors folytatáshoz.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is