Audio Session ist der zentrale Mechanismus in iOS zur Verwaltung des Audioverhaltens einer App: Interaktion mit dem System, Behandlung von Unterbrechungen und Audio-Routing. Jede iOS-App erhält eine einzige Audiosession, die bestimmt, wie sich Sound bei gesperrtem Bildschirm, während Anrufen und beim Verbinden von Bluetooth verhält. Laut Apple Developer Documentation, 2026 wird Audio Session über eine Kategorie und einen Modus konfiguriert — ohne korrekte Konfiguration kann die App im Hintergrund möglicherweise keinen Sound abspielen.
Wichtige Punkte
Audio Session ist eine einzelne AVAudioSession-Instanz, die vom System beim Start einer App erstellt wird und während des gesamten Lebenszyklus existiert. Sie fungiert als Vermittler zwischen der App und dem iOS-Audiosystem: Die Kategoriekonfiguration bestimmt, ob die App im Hintergrund Sound abspielen darf, ob der Sound während eines Anrufs stummgeschaltet wird und an welche Geräte Audio ausgegeben wird.
Im Gegensatz zu Android Audio Focus, wo jede App unabhängig den Fokus anfordert und freigibt, wird iOS Audio Session zentral über eine Session pro App verwaltet. Wenn eine Session aktiviert wird, deaktiviert das System automatisch die Session der vorherigen App und sendet ihr eine Unterbrechungsbenachrichtigung. Dieser architektonische Unterschied definiert die unterschiedlichen Ansätze zur Audioverarbeitung auf den beiden Plattformen.
Laut WWDC 2024 Session 211 werden etwa 40% der Audioprobleme in iOS-Apps durch falsche Audio Session-Konfiguration verursacht. Der häufigste Fehler ist die Wahl der Kategorie ambient anstelle von playback, wodurch der Ton bei gesperrtem Bildschirm verschwindet.
Beim Start erhält die App die sharedInstance der Session, setzt die Kategorie über den Aufruf setCategory(_:mode:options:) und aktiviert die Session über setActive(true). Nach der Aktivierung berücksichtigt iOS die Kategorierichtlinien für das Routing. Wenn eine andere App ihre Session aktiviert, erhält die aktuelle eine AudioSessionInterruptionType.began-Benachrichtigung über Notification.Name.AVAudioSessionInterruption.
Die Kategorie ist der Hauptparameter von Audio Session, der sechs vordefinierte Verhaltensoptionen definiert. Die Wahl einer Kategorie ist die erste und wichtigste Entscheidung bei der Einrichtung von Audio in iOS.
| Kategorie | Wann verwenden | Hintergrundaudio | Stummschalter beeinflusst |
|---|---|---|---|
| ambient | Spiele, Hintergrundeffekte | Nein | Ja |
| playback | Musik, Podcasts, Hörbücher | Ja | Nein |
| record | Sprachmemos, Audioaufnahme | Nein | N/V |
| playAndRecord | VoIP, Sprachnachrichten | Ja | Nein |
| multiRoute | DJ-Mixer, Karaoke | Ja | Nein |
| soloAmbient | Standard (iOS default) | Nein | Ja |
Für Musik- und Videoplayer verwenden Sie immer playback. Diese Kategorie erlaubt: Tonwiedergabe bei gesperrtem Bildschirm, bei ausgeschaltetem Stummschalter (physischer Knopf am iPhone) und bei minimierter App. Ohne die Playback-Kategorie wird die Session bei gesperrtem Bildschirm oder minimierter App deaktiviert.
Die Kategorie ambient eignet sich für Spiele und Apps mit Hintergrundgeräuschen — sie erlaubt anderen Apps, weiterzuspielen. Wenn ein Benutzer beispielsweise Musik hört und ein Spiel mit einer Ambient-Session öffnet, läuft die Musik über die Spielgeräusche weiter. Dies ist ein grundlegender Unterschied zu Android, wo ein solches Szenario eine explizite Duck-Erlaubnis erfordert.
Die Audio Session-Konfiguration sollte vor Beginn einer Wiedergabe erfolgen. Es wird empfohlen, die Session in der Methode application(_:didFinishLaunchingWithOptions:) oder im Initialisierer des Players zu konfigurieren. Nach dem Setzen der Kategorie muss die Session aktiviert werden.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Audio Session-Einrichtung fehlgeschlagen: \(error.localizedDescription)")
}
Der Parameter options enthält allowBluetooth (Ausgabe an Bluetooth-Headset) und defaultToSpeaker (Wiedergabe über den Lautsprecher statt über die Hörmuschel). Die Option allowBluetooth ist für Apps erforderlich, die Bluetooth-Kopfhörer unterstützen — ohne sie kann der Ton selbst bei angeschlossenem Headset an den integrierten Lautsprecher geleitet werden.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
Die Kategorie playAndRecord mit dem Modus voiceChat optimiert den Audiopfad für Sprachkommunikation: aktiviert Echounterdrückung, automatische Verstärkungsregelung (AGC) und wählt den optimalen Codec. OverrideOutputAudioPort(.speaker) erzwingt die Ausgabe über den Lautsprecher, auch wenn ein Headset angeschlossen ist — nützlich für die Freisprecheinrichtung.
Der Aufruf von setActive(true) aktiviert die Session und benachrichtigt das System, dass die App Audio verwendet. Wenn die Wiedergabe pausiert wird, empfiehlt es sich, die Session zu deaktivieren, damit andere Apps den Audiostream erhalten. Eine Ausnahme bilden Apps mit langer Hintergrundwiedergabe (Musik, Podcasts), bei denen die Session während des gesamten Titels aktiv bleibt.
Es ist wichtig, Fehler bei setActive zu behandeln. Wenn eine andere Session mit hoher Priorität aktiv ist (z. B. Telefon während eines Anrufs), kann setActive einen Fehler auslösen. In diesem Fall müssen Sie auf die AudioSessionInterruptionType.ended-Benachrichtigung warten und die Aktivierung erneut versuchen.
Der Modus verfeinert die Kategorie und optimiert den Audiopfad für einen bestimmten Anwendungsfall. Jeder Modus ändert das Verhalten von AGC, Echounterdrückung und Codecs. Modi ersetzen die Kategorie nicht, sondern ergänzen sie — eine Kategorie kann mit verschiedenen Modi arbeiten.
Optionen bieten eine Feinabstimmung des Sessionverhaltens. Jede Option ist ein Flag, das mit anderen in einem Array kombiniert werden kann. Beispielsweise erlaubt [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] die Audioausgabe an ein Bluetooth-Headset, verwendet standardmäßig den Lautsprecher und mischt sich mit Hörbüchern.
Ab iOS 17+ gibt es die Option spatialAudio, die personalisierten räumlichen Klang für AirPods über AVAudioSessionSpatialPreferences aktiviert. Laut WWDC 2024 steigert räumlicher Klang das Benutzerengagement in Musik-Apps in Apples Tests um 25%.
Unterbrechungen sind ein Hauptunterschied zwischen Audio Session und Android Audio Focus. In iOS werden Unterbrechungen über NotificationCenter durch Abonnieren von AVAudioSession.interruptionNotification behandelt. Die Benachrichtigung enthält ein Wörterbuch mit dem Unterbrechungstyp: began oder 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()
}
}
Beim Empfang von interruptionType.began sollte der Player die Wiedergabe pausieren. Beim Empfang von interruptionType.ended gibt die Eigenschaft interruptionOptionKey an, ob der Player automatisch fortsetzen kann (shouldResume). Wenn der Benutzer den Anruf abgelehnt hat, ist shouldResume = true. Wenn der Anruf durch Zeitüberschreitung beendet wurde — shouldResume = false, eine Fortsetzung ist nicht erlaubt.
Wenn eine andere App ihre Audio Session mit der Kategorie playback aktiviert, erhält die aktuelle Session eine Unterbrechungsbenachrichtigung. Wenn eine andere App ambient verwendet, erfolgt keine Unterbrechung — die Töne werden gemischt. Dieses Verhalten unterscheidet sich grundlegend von Android, wo jede Audio Focus-Aktivierung ein LOSS-Ereignis auslöst.
Für Apps, die bei Aktivierung anderer Sessions weiter abspielen müssen (z. B. Navigation während der Musikwiedergabe), verwenden Sie die Option .mixWithOthers. Diese Option erlaubt das Mischen von Sound mit anderen Apps, und es werden keine Unterbrechungen gesendet. MixWithOthers ist das iOS-Äquivalent des Duck-Modus in Android.
Audio Session verwaltet automatisch das Audio-Routing zwischen integrierten Lautsprechern, Kopfhörern, Bluetooth-Headsets und AirPlay-Geräten. Die App kann die aktuelle Route über die Eigenschaft currentRoute überwachen und Benachrichtigungen über Änderungen über AVAudioSession.routeChangeNotification erhalten.
Wenn Bluetooth-Kopfhörer angeschlossen werden, schaltet iOS automatisch die Audioausgabe auf diese um, wenn die Session mit der Option allowBluetooth konfiguriert ist. Ohne diese Option läuft der Ton weiter über den integrierten Lautsprecher. Ab iOS 16 aktiviert das System beim Anschließen von AirPods Pro automatisch die ProMotion-Synchronisation zur Reduzierung der Latenz.
Das Abonnieren von routeChangeNotification ermöglicht Reaktionen auf das Anschließen und Trennen von Kopfhörern. Wenn ein Bluetooth-Headset getrennt wird, sollte der Player die Wiedergabe pausieren — der Benutzer erwartet möglicherweise nicht, dass der Ton aus dem Telefonlautsprecher kommt. Laut Apple HIG (2026) ist dies für Musik-Apps ein erforderliches Verhalten.
Die Eigenschaften availableInputs und availableOutputs geben eine Liste verfügbarer Audiogeräte mit ihren Typen zurück (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Der Entwickler kann über overrideOutputAudioPort programmatisch ein bestimmtes Gerät für benutzerdefinierte Routingszenarien auswählen.
Häufig gestellte Fragen
Der Hauptunterschied ist die Architektur. Audio Session ist eine einzige zentralisierte Session pro App, die einmal konfiguriert wird. Android Audio Focus erfordert bei jeder Wiedergabe eine manuelle Fokusanforderung. Außerdem unterstützt iOS das Mischen über die Option mixWithOthers, während in Android Duck die einzige Alternative zum vollständigen Stopp ist.
Die häufigste Ursache ist eine falsche Audio Session-Kategorie. Wenn ambient oder soloAmbient ausgewählt ist, stoppt der Ton bei gesperrtem Bildschirm. Wechseln Sie die Kategorie zu playback und stellen Sie sicher, dass Background Modes — Audio, AirPlay, and Picture in Picture in der Info.plist hinzugefügt ist.
Fügen Sie die Option .mixWithOthers zu setCategory hinzu. Dadurch kann der Sound Ihrer App mit anderen aktiven Sessions gemischt werden. Ohne diese Option unterbricht eine neue App die aktuelle. MixWithOthers ist das Analogon des Duck-Modus in Android, jedoch mit vollständiger Lautstärkeerhaltung.
Verwenden Sie overrideOutputAudioPort mit nil für die automatische Auswahl. Für erzwungene Ausgabe an Bluetooth: Holen Sie sich die AVAudioSessionRouteDescription aus availableOutputs, wählen Sie einen Port vom Typ .bluetoothA2DP und übergeben Sie ihn an overrideOutputAudioPort. Stellen Sie sicher, dass die Session mit allowBluetooth konfiguriert ist.
Für die meisten Apps — ja. Das Deaktivieren der Session bei Pause ermöglicht anderen Apps, Audiofokus zu erhalten. Die Ausnahme sind Musik-Player mit langer Hintergrundwiedergabe. Wenn die Pause kurz ist (weniger als 5 Sekunden), ist es besser, die Session für eine schnelle Wiederaufnahme aktiv zu lassen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch