Audio Session est le mécanisme central d’iOS pour gérer le comportement audio d’une application : interaction avec le système, gestion des interruptions et routage audio. Chaque application iOS reçoit une session audio unique qui détermine comment le son se comporte lorsque l’écran est verrouillé, pendant les appels et lors de la connexion Bluetooth. Selon la Documentation Développeur Apple, 2026, Audio Session se configure via une catégorie et un mode — sans configuration correcte, l’application peut ne pas lire le son en arrière-plan.
Points clés
Audio Session est une instance unique d’AVAudioSession créée par le système au lancement d’une application et qui existe pendant tout son cycle de vie. Elle agit comme intermédiaire entre l’application et le système audio d’iOS : la configuration de la catégorie détermine si l’application peut lire du son en arrière-plan, si le son sera coupé pendant un appel et vers quels périphériques sortir l’audio.
Contrairement à Android Audio Focus, où chaque application demande et libère le focus de manière indépendante, Audio Session d’iOS est géré de manière centralisée via une session par application. Lorsqu’une session est activée, le système désactive automatiquement la session de l’application précédente, lui envoyant une notification d’interruption. Cette différence architecturale définit les différentes approches de gestion audio sur les deux plateformes.
Selon la session 211 de la WWDC 2024, environ 40 % des problèmes audio dans les applications iOS sont causés par une configuration incorrecte d’Audio Session. L’erreur la plus fréquente est de choisir la catégorie ambient au lieu de playback, ce qui fait disparaître le son lorsque l’écran est verrouillé.
Au lancement, l’application obtient le sharedInstance de la session, définit la catégorie via l’appel setCategory(_:mode:options:) et active la session via setActive(true). Après l’activation, iOS prend en compte les politiques de catégorie pour le routage. Si une autre application active sa session, la session actuelle reçoit une notification AudioSessionInterruptionType.began via Notification.Name.AVAudioSessionInterruption.
La catégorie est le paramètre principal d’Audio Session, définissant six options de comportement prédéfinies. Choisir une catégorie est la première et la plus importante décision lors de la configuration audio dans iOS.
| Catégorie | Quand l’utiliser | Audio en arrière-plan | Silence affecte |
|---|---|---|---|
| ambient | Jeux, effets d’arrière-plan | Non | Oui |
| playback | Musique, podcasts, livres audio | Oui | Non |
| record | Dictaphone, enregistrement audio | Non | N/D |
| playAndRecord | VoIP, messages vocaux | Oui | Non |
| multiRoute | Mixeurs DJ, karaoké | Oui | Non |
| soloAmbient | Par défaut (iOS default) | Non | Oui |
Pour les lecteurs de musique et de vidéo, utilisez toujours playback. Cette catégorie permet : de lire du son avec l’écran verrouillé, avec l’interrupteur silence désactivé (bouton physique sur l’iPhone) et avec l’application en arrière-plan. Sans la catégorie playback, la session est désactivée lors du verrouillage de l’écran ou de la minimisation de l’application.
La catégorie ambient convient aux jeux et aux applications avec des sons d’arrière-plan — elle permet aux autres applications de continuer à lire. Par exemple, si un utilisateur écoute de la musique et ouvre un jeu avec une session ambient, la musique continue de jouer par-dessus les sons du jeu. C’est une différence fondamentale avec Android, où un tel scénario nécessite une autorisation explicite de duck.
La configuration d’Audio Session doit être effectuée avant le début de toute lecture. Il est recommandé de configurer la session dans la méthode application(_:didFinishLaunchingWithOptions:) ou dans l’initialisateur du lecteur. Après avoir défini la catégorie, la session doit être activée.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Échec de configuration d’Audio Session : \(error.localizedDescription)")
}
Le paramètre options inclut allowBluetooth (sortie vers un casque Bluetooth) et defaultToSpeaker (lecture via le haut-parleur plutôt que l’écouteur). L’option allowBluetooth est obligatoire pour les applications prenant en charge les casques Bluetooth — sans elle, le son peut êre dirigé vers le haut-parleur intégré même lorsqu’un casque est connecté.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
La catégorie playAndRecord avec le mode voiceChat optimise le chemin audio pour la communication vocale : active la suppression d’écho, le contrôle automatique de gain (AGC) et sélectionne le codec optimal. OverrideOutputAudioPort(.speaker) force la sortie via le haut-parleur même lorsqu’un casque est connecté — utile pour le haut-parleur.
L’appel à setActive(true) active la session et notifie le système que l’application utilisera l’audio. Lorsque la lecture est mise en pause, il est recommandé de désactiver la session pour que d’autres applications puissent obtenir le flux audio. L’exception concerne les applications avec une lecture prolongée en arrière-plan (musique, podcasts), où la session reste active pendant tout le morceau.
Il est important de gérer les erreurs lors de l’appel à setActive. Si une autre session de haute priorité est active (par exemple, Téléphone pendant un appel), setActive peut générer une erreur. Dans ce cas, attendez la notification AudioSessionInterruptionType.ended et réessayez l’activation.
Le mode affine la catégorie et optimise le chemin audio pour un cas d’utilisation spécifique. Chaque mode modifie le comportement de l’AGC, de la suppression d’écho et des codecs. Les modes ne remplacent pas la catégorie mais la complètent — une catégorie peut fonctionner avec différents modes.
Les options offrent un réglage fin du comportement de la session. Chaque option est un indicateur qui peut êre combiné avec d’autres dans un tableau. Par exemple, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] permet la sortie sonore vers un casque Bluetooth, utilise le haut-parleur par défaut et se mélange avec les livres audio.
Sur iOS 17+, l’option spatialAudio est apparue, qui active l’audio spatial personnalisé pour AirPods via AVAudioSessionSpatialPreferences. Selon la WWDC 2024, l’audio spatial augmente l’engagement des utilisateurs dans les applications musicales de 25 % dans les tests d’Apple.
Les interruptions sont une différence clé entre Audio Session et Android Audio Focus. Sous iOS, les interruptions sont gérées via NotificationCenter en s’abonnant à AVAudioSession.interruptionNotification. La notification contient un dictionnaire avec le type d’interruption : began ou 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()
}
}
Lors de la réception de interruptionType.began, le lecteur doit mettre en pause la lecture. Lors de la réception de interruptionType.ended, la propriété interruptionOptionKey indique si le lecteur peut reprendre automatiquement (shouldResume). Si l’utilisateur a refusé l’appel, shouldResume = true. Si l’appel s’est terminé par un délai d’attente — shouldResume = false, la reprise n’est pas autorisée.
Lorsqu’une autre application active son Audio Session avec la catégorie playback, la session actuelle reçoit une notification d’interruption. Si une autre application utilise ambient, aucune interruption ne se produit — les sons sont mélangés. Ce comportement est radicalement différent d’Android, où toute activation d’Audio Focus déclenche un événement LOSS.
Pour les applications qui doivent continuer la lecture lors de l’activation d’autres sessions (par exemple, la navigation pendant la lecture de musique), utilisez l’option .mixWithOthers. Cette option permet le mélange du son avec d’autres applications et aucune interruption n’est envoyée. MixWithOthers est l’équivalent iOS du mode duck dans Android.
Audio Session gère automatiquement le routage audio entre les haut-parleurs intégrés, les écouteurs, les casques Bluetooth et les périphériques AirPlay. L’application peut surveiller la route actuelle via la propriété currentRoute et recevoir des notifications de changement via AVAudioSession.routeChangeNotification.
Lorsque des écouteurs Bluetooth sont connectés, iOS bascule automatiquement la sortie audio vers eux si la session est configurée avec l’option allowBluetooth. Sans cette option, le son continue via le haut-parleur intégré. À partir d’iOS 16, lors de la connexion d’AirPods Pro, le système active automatiquement la synchronisation ProMotion pour réduire la latence.
S’abonner à routeChangeNotification permet de réagir à la connexion et la déconnexion des écouteurs. Lorsqu’un casque Bluetooth est déconnecté, le lecteur doit mettre en pause la lecture — l’utilisateur pourrait ne pas s’attendre à ce que le son commence à sortir du haut-parleur du téléphone. Selon Apple HIG (2026), c’est un comportement obligatoire pour les applications musicales.
Les propriétés availableInputs et availableOutputs retournent une liste des périphériques audio disponibles avec leurs types (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Le développeur peut sélectionner programmatiquement un périphérique spécifique via overrideOutputAudioPort pour des scénarios de routage personnalisés.
Foire aux questions
La différence clé est l’architecture. Audio Session est une session centralisée unique par application configurée une fois. Android Audio Focus nécessite une demande manuelle de focus à chaque lecture. De plus, iOS prend en charge le mélange via l’option mixWithOthers, tandis que sur Android, duck est la seule alternative à l’arrêt complet.
La cause la plus fréquente est une catégorie Audio Session incorrecte. Si ambient ou soloAmbient est sélectionné, le son s’arrête lorsque l’écran est verrouillé. Basculez la catégorie sur playback et assurez-vous que Background Modes — Audio, AirPlay, and Picture in Picture est ajouté dans Info.plist.
Ajoutez l’option .mixWithOthers à setCategory. Cela permettra de mélanger le son de votre application avec d’autres sessions actives. Sans cette option, une nouvelle application interrompt l’application en cours. MixWithOthers est l’analogue du mode duck dans Android, mais avec une préservation complète du volume.
Utilisez overrideOutputAudioPort avec nil pour la sélection automatique. Pour une sortie forcée vers Bluetooth : obtenez AVAudioSessionRouteDescription à partir d’availableOutputs, sélectionnez un port de type .bluetoothA2DP et transmettez-le à overrideOutputAudioPort. Assurez-vous que la session est configurée avec allowBluetooth.
Pour la plupart des applications — oui. La désactivation de la session en pause permet aux autres applications d’obtenir le focus audio. L’exception concerne les lecteurs de musique avec une lecture prolongée en arrière-plan. Si la pause est courte (moins de 5 secondes), il est préférable de garder la session active pour une reprise rapide.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi