Audio Session — iOS centrala mekanism för att hantera applikationens ljudbeteende: interaktion med systemet, hantering av avbrott och dirigering av ljud. Varje iOS-applikation får en enda ljudsession som bestämmer hur ljud beter sig vid skärmlåsning, samtal och Bluetooth-anslutning. Enligt Apple Developer Documentation, 2026 konfigureras Audio Session via kategori och läge — utan korrekt konfiguration kan applikationen inte spela upp ljud i bakgrunden.
Huvudpunkter
Audio Session — är en enda AVAudioSession-instans som skapas av systemet när applikationen startar och finns under hela dess livscykel. Den fungerar som en mellanhand mellan applikationen och iOS ljudsystem: kategoriinställningen bestämmer om applikationen får spela upp ljud i bakgrunden, om ljudet ska dämpas under samtal och till vilka enheter ljudet ska skickas.
Till skillnad från Android Audio Focus, där varje applikation självständigt begär och släpper fokus, hanteras iOS Audio Session centraliserat via en session per applikation. Vid aktivering av sessionen avaktiverar systemet automatiskt den föregående applikationens session och skickar ett avbrottsmeddelande till den. Denna arkitektoniska skillnad bestämmer olika tillvägagångssätt för ljudhantering på de två plattformarna.
Enligt WWDC 2024 Session 211 orsakas cirka 40% av ljudproblemen i iOS-applikationer av felaktig konfiguration av Audio Session. Det vanligaste felet — att välja kategorin ambient istället för playback, vilket gör att ljudet försvinner vid skärmlåsning.
Vid start får applikationen sessionens sharedInstance, ställer in kategorin via anropet setCategory(_:mode:options:) och aktiverar sessionen via setActive(true). Efter aktivering tar iOS hänsyn till kategoripolicyer för dirigering. Om en annan applikation aktiverar sin session får den aktuella meddelandet AudioSessionInterruptionType.began via Notification.Name.AVAudioSessionInterruption.
Kategori — huvudparametern för Audio Session som bestämmer sex fördefinierade beteendevarianter. Valet av kategori är det första och viktigaste beslutet vid konfiguration av ljud i iOS.
| Kategori | När ska man använda | Bakgrundsljud | Dämpning vid mute |
|---|---|---|---|
| ambient | Spel, bakgrundseffekter | Nej | Ja |
| playback | Musik, podcaster, ljudböcker | Ja | Nej |
| record | Diktafon, ljudinspelning | Nej | N/A |
| playAndRecord | VoIP, röstmeddelanden | Ja | Nej |
| multiRoute | DJ-mixrar, karaoke | Ja | Nej |
| soloAmbient | Standard (iOS default) | Nej | Ja |
För musik- och videospelare, använd alltid playback. Denna kategori tillåter: uppspelning av ljud med låst skärm, med avstängd mute-knapp (fysisk knapp på iPhone-höljet) och med minimerad applikation. Utan kategorin playback avaktiveras sessionen vid skärmlåsning eller minimering av applikationen.
Kategorin ambient passar för spel och applikationer med bakgrundsljud — låter andra applikationer fortsätta uppspelning. Till exempel, om användaren lyssnar på musik och öppnar ett spel med en ambient-session fortsätter musiken att spelas över spelets ljud. Detta är en grundläggande skillnad från Android, där ett sådant scenario kräver explicit duck-tillstånd.
Konfiguration av Audio Session bör utföras innan någon uppspelning påbörjas. Det rekommenderas att konfigurera sessionen i metoden application(_:didFinishLaunchingWithOptions:) eller i spelarens initierare. Efter konfigurering av kategorin måste sessionen aktiveras.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Konfigurering av Audio Session misslyckades: \(error.localizedDescription)")
}
Parametern options inkluderar allowBluetooth (utgång till Bluetooth-headset) och defaultToSpeaker (uppspelning via högtalare, inte via hörluren). Alternativet allowBluetooth är obligatoriskt för applikationer som stöder Bluetooth-hörlurar — utan det kan ljudet matas ut via den inbyggda högtalaren även med anslutet headset.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
Kategorin playAndRecord med läget voiceChat optimerar ljudvägen för röstkommunikation: inkluderar eko-undertryckning, automatisk förstärkningsreglering (AGC) och val av optimal codec. OverrideOutputAudioPort(.speaker) tvingar utgång via högtalaren även med anslutet headset — användbart för högtalarsamtal.
Anropet setActive(true) aktiverar sessionen och meddelar systemet att applikationen kommer att använda ljud. Vid paus av uppspelning rekommenderas att avaktivera sessionen så att andra applikationer kan få ljudströmmen. Undantag — applikationer med lång bakgrundsuppspelning (musik, podcaster), där sessionen förblir aktiv under hela låten.
Det är viktigt att hantera fel vid setActive. Om en annan session med hög prioritet är aktiv (t.ex. Telefon under samtal) kan setActive generera ett fel. I så fall måste du vänta på meddelandet AudioSessionInterruptionType.ended och försöka aktivera igen.
Läget (mode) specificerar kategorin och optimerar ljudvägen för en specifik användningstyp. Varje läge ändrar beteendet hos AGC, eko-undertryckning och codecs. Lägen ersätter inte kategorin utan kompletterar den — en kategori kan fungera med olika lägen.
Alternativen ger finjustering av sessionens beteende. Varje alternativ är en flagga som kombineras med andra i en array. Till exempel, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] tillåter att ljudet skickas till Bluetooth-headset, använda högtalaren som standard och mixas med ljudböcker.
I iOS 17+ dök alternativet spatialAudio upp, som aktiverar personligt rumsligt ljud för AirPods via AVAudioSessionSpatialPreferences. Enligt WWDC 2024 ökar rumsligt ljud engagemanget hos användare av musikapplikationer med 25% i Apple-tester.
Avbrott (interruptions) — den viktigaste skillnaden mellan Audio Session och Android Audio Focus. I iOS hanteras avbrott via NotificationCenter genom att prenumerera på AVAudioSession.interruptionNotification. Meddelandet innehåller en ordbok med avbrottstyp: began eller 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()
}
}
Vid mottagning av interruptionType.began bör spelaren pausa uppspelningen. Vid interruptionType.ended anger egenskapen interruptionOptionKey om spelaren automatiskt kan återuppta (shouldResume). Om användaren avslutade samtalet, shouldResume = true. Om samtalet avslutades på grund av timeout — shouldResume = false, återupptagning är inte tillåten.
När en annan applikation aktiverar sin Audio Session med kategorin playback får den aktuella sessionen ett avbrottsmeddelande. Om den andra applikationen använder ambient sker inget avbrott — ljuden mixas. Detta beteende skiljer sig radikalt från Android, där varje aktivering av Audio Focus orsakar en LOSS-händelse.
För applikationer som måste fortsätta uppspelning vid aktivering av andra sessioner (t.ex. navigering medan musik spelas), använd alternativet .mixWithOthers. Detta alternativ tillåter mixning av ljud med andra applikationer och avbrott skickas inte. MixWithOthers — iOS-motsvarigheten till duck-läget i Android.
Audio Session hanterar automatiskt dirigeringen av ljud mellan inbyggda högtalare, hörlurar, Bluetooth-headset och AirPlay-enheter. Applikationen kan spåra den aktuella vägen via egenskapen currentRoute och få meddelanden om ändringar via AVAudioSession.routeChangeNotification.
Vid anslutning av Bluetooth-hörlurar växlar iOS automatiskt ljudutgången till dem om sessionen är konfigurerad med alternativet allowBluetooth. Utan detta alternativ fortsätter ljudet att flöda via den inbyggda högtalaren. Från och med iOS 16, vid anslutning av AirPods Pro, aktiverar systemet automatiskt ProMotion-synkronisering för att minska latensen.
Prenumeration på routeChangeNotification gör det möjligt att reagera på anslutning och frånkoppling av hörlurar. Vid frånkoppling av Bluetooth-headset bör spelaren pausa uppspelningen — användaren förväntar sig kanske inte att ljudet börjar spelas från telefonhögtalaren. Enligt Apple HIG (2026) är detta obligatoriskt beteende för musikapplikationer.
Egenskaperna availableInputs och availableOutputs returnerar en lista över tillgängliga ljudenheter med deras typer (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Utvecklaren kan programmatiskt välja en specifik enhet via overrideOutputAudioPort för anpassade dirigeringsscenarier.
Vanliga frågor
Den viktigaste skillnaden — arkitektur. Audio Session är en centraliserad session per applikation som konfigureras en gång. Audio Focus i Android kräver manuell fokusbegäran varje gång vid uppspelning. Dessutom stöder iOS mixning via alternativet mixWithOthers, medan i Android är duck det enda alternativet till fullständig stopp.
Den vanligaste orsaken — felaktig kategori för Audio Session. Om ambient eller soloAmbient är vald stannar ljudet vid skärmlåsning. Byt kategori till playback och se till att Background Modes — Audio, AirPlay, and Picture in Picture har lagts till i Info.plist.
Lägg till alternativet .mixWithOthers i setCategory. Detta tillåter mixning av din applikations ljud med andra aktiva sessioner. Utan detta alternativ avbryter den nya applikationen den aktuella. MixWithOthers — motsvarigheten till duck-läget i Android, men med fullständigt bibehållen volym.
Använd overrideOutputAudioPort med nil för automatisk val. För tvingad utgång till Bluetooth: hämta AVAudioSessionRouteDescription från availableOutputs, välj port med typen .bluetoothA2DP och skicka den till overrideOutputAudioPort. Se till att sessionen är konfigurerad med allowBluetooth.
För de flesta applikationer — ja. Avaktivering av sessionen vid paus gör att andra applikationer kan få ljudfokus. Undantag — musikspelare med lång bakgrundsuppspelning. Om pausen är kort (mindre än 5 sekunder) är det bättre att låta sessionen vara aktiv för snabb återupptagning.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också