Audio Session — vad är det, kategorier och konfiguration i iOS

Författare: IT Sectr Publicerad: 2026-05-24 Lästid: 8 min

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 (AVAudioSession) — iOS-systemobjekt som hanterar applikationens ljudbeteende på operativsystemsnivå.
  • Sessionens kategori bestämmer grundläggande beteende: playback, record, ambient, playAndRecord och andra.
  • Lägen och alternativ specificerar beteendet: default, voiceChat, videoRecording, allowBluetooth.
  • Vid avbrott (samtal, alarm) får sessionen ett meddelande via NotificationCenter med typen interruptionType.
  • För bakgrundsuppspelning måste Background Modes — Audio, AirPlay and Picture in Picture aktiveras.

Vad är Audio Session?

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.

Funktionsprincip för AVAudioSession

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.

Kategorier av Audio Session

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.

KategoriNär ska man användaBakgrundsljudDämpning vid mute
ambientSpel, bakgrundseffekterNejJa
playbackMusik, podcaster, ljudböckerJaNej
recordDiktafon, ljudinspelningNejN/A
playAndRecordVoIP, röstmeddelandenJaNej
multiRouteDJ-mixrar, karaokeJaNej
soloAmbientStandard (iOS default)NejJa

Playback-kategori — huvudvalet för spelare

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.

Hur man konfigurerar Audio Session

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.

Grundläggande konfiguration av Audio Session i Swift

swift
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.

Konfiguration för inspelning och uppspelning (VoIP)

swift
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.

Aktivering och avaktivering av sessionen

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ägen och policyer för Audio Session

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.

  • default — standardläge för musik och video. AGC avstängt, eko-undertryckning minimal.
  • voiceChat — optimering för VoIP. Inkluderar eko-undertryckning, AGC, brusreducering. Använd med kategorin playAndRecord.
  • videoRecording — för videoinspelning. Prioritet av inspelningskvalitet över uppspelning. Använd med kategorin record eller playAndRecord.
  • measurement — för ljudmätningar. Minimal signalbehandling, ingen AGC eller eko-undertryckning.
  • gameChat — för röstchatt i spel. Liknar voiceChat men med prioritet för spelljud.
  • moviePlayback — för att titta på filmer. Optimering för flerkanaligt ljud (5.1, 7.1) och Dolby Atmos.

Alternativ för Audio Session-kategori

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.

Hantering av avbrott och samtal

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.

Prenumerera på avbrottsmeddelanden

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

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.

Hantering av avbrott från andra applikationer

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.

Ljuddirigering och Bluetooth

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.

Övervakning av vägändring

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

Vad skiljer Audio Session från Android Audio Focus?

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.

Varför försvinner ljudet vid låsning av iPhone-skärmen?

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.

Hur tillåter man två applikationer att spela samtidigt i iOS?

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.

Hur växlar man programmatiskt ljudet till en Bluetooth-högtalare?

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.

Måste jag anropa setActive(false) när spelaren pausas?

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

  • Audio Session (AVAudioSession) — en ljudsession per applikation i iOS som hanterar ljudbeteendet på operativsystemsnivå.
  • Sex kategorier: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — bestämmer grundläggande ljudbeteende.
  • För bakgrundsuppspelning krävs kategorin playback och Background Modes i Info.plist.
  • Avbrott hanteras via NotificationCenter med typerna began (paus) och ended (återupptagning vid shouldResume).
  • Alternativet .mixWithOthers aktiverar mixning av ljud med andra applikationer utan avbrott.
  • Dirigeringen hanteras automatiskt men övervakas via routeChangeNotification för paus vid frånkoppling av hörlurar.
  • Kategorin playAndRecord med läget voiceChat — standard för VoIP-applikationer med eko-undertryckning och AGC.

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.

Diskutera projektet

Läs också