Audio Session è il meccanismo centrale di iOS per gestire il comportamento audio di un’app: interazione con il sistema, gestione delle interruzioni e instradamento audio. Ogni app iOS riceve una singola sessione audio che determina come il suono si comporta quando lo schermo è bloccato, durante le chiamate e quando si connette Bluetooth. Secondo la Documentazione per Sviluppatori Apple, 2026, Audio Session viene configurata tramite una categoria e una modalità — senza una configurazione corretta, l’app potrebbe non riprodurre il suono in background.
Punti Chiave
Audio Session è una singola istanza di AVAudioSession creata dal sistema all’avvio di un’app che esiste per tutto il suo ciclo di vita. Funge da intermediario tra l’app e il sistema audio di iOS: la configurazione della categoria determina se l’app può riprodurre suono in background, se il suono verrà silenziato durante una chiamata e su quali dispositivi inviare l’audio.
A differenza di Android Audio Focus, dove ogni app richiede e rilascia il focus in modo indipendente, Audio Session di iOS è gestito centralmente tramite una sessione per app. Quando una sessione viene attivata, il sistema disattiva automaticamente la sessione dell’app precedente, inviandole una notifica di interruzione. Questa differenza architetturale definisce i diversi approcci alla gestione audio sulle due piattaforme.
Secondo la Sessione 211 del WWDC 2024, circa il 40% dei problemi audio nelle app iOS è causato da una configurazione errata di Audio Session. L’errore più comune è scegliere la categoria ambient invece di playback, causando la scomparsa del suono quando lo schermo viene bloccato.
All’avvio, l’app ottiene lo sharedInstance della sessione, imposta la categoria tramite la chiamata setCategory(_:mode:options:) e attiva la sessione tramite setActive(true). Dopo l’attivazione, iOS considera le politiche di categoria per l’instradamento. Se un’altra app attiva la sua sessione, quella corrente riceve una notifica AudioSessionInterruptionType.began tramite Notification.Name.AVAudioSessionInterruption.
La categoria è il parametro principale di Audio Session, che definisce sei opzioni predefinite di comportamento. Scegliere una categoria è la prima e più importante decisione quando si configura l’audio in iOS.
| Categoria | Quando Usarla | Audio in Background | Silenzioso Influisce |
|---|---|---|---|
| ambient | Giochi, effetti di sfondo | No | Sì |
| playback | Musica, podcast, audiolibri | Sì | No |
| record | Memo vocali, registrazione audio | No | N/D |
| playAndRecord | VoIP, messaggi vocali | Sì | No |
| multiRoute | Mixer DJ, karaoke | Sì | No |
| soloAmbient | Predefinito (iOS default) | No | Sì |
Per lettori musicali e video, utilizzare sempre playback. Questa categoria consente di riprodurre suono con lo schermo bloccato, con l’interruttore silenzioso spento (pulsante fisico sull’iPhone) e con l’app in background. Senza la categoria playback, la sessione viene disattivata quando lo schermo viene bloccato o l’app viene ridotta a icona.
La categoria ambient è adatta per giochi e app con suoni di sottofondo — consente ad altre app di continuare a riprodurre. Ad esempio, se un utente sta ascoltando musica e apre un gioco con una sessione ambient, la musica continua a suonare sopra i suoni del gioco. Questa è una differenza fondamentale rispetto ad Android, dove tale scenario richiede un’autorizzazione esplicita di duck.
La configurazione di Audio Session dovrebbe essere effettuata prima di iniziare qualsiasi riproduzione. Si consiglia di configurare la sessione nel metodo application(_:didFinishLaunchingWithOptions:) o nell’inizializzatore del lettore. Dopo aver impostato la categoria, la sessione deve essere attivata.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Configurazione Audio Session fallita: \(error.localizedDescription)")
}
Il parametro options include allowBluetooth (uscita verso auricolare Bluetooth) e defaultToSpeaker (riproduzione tramite altoparlante invece dell’auricolare). L’opzione allowBluetooth è obbligatoria per le app che supportano cuffie Bluetooth — senza di essa, il suono potrebbe essere instradato all’altoparlante integrato anche quando un auricolare è collegato.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
La categoria playAndRecord con modalità voiceChat ottimizza il percorso audio per la comunicazione vocale: attiva la cancellazione dell’eco, il controllo automatico del guadagno (AGC) e seleziona il codec ottimale. OverrideOutputAudioPort(.speaker) forza l’uscita tramite l’altoparlante anche quando un auricolare è collegato — utile per il vivavoce.
Chiamare setActive(true) attiva la sessione e notifica al sistema che l’app utilizzerà l’audio. Quando la riproduzione viene messa in pausa, si consiglia di disattivare la sessione in modo che altre app possano ottenere il flusso audio. L’eccezione sono le app con riproduzione prolungata in background (musica, podcast), dove la sessione rimane attiva per l’intera traccia.
È importante gestire gli errori quando si chiama setActive. Se un’altra sessione con alta priorità è attiva (ad esempio, Telefono durante una chiamata), setActive potrebbe generare un errore. In questo caso, attendere la notifica AudioSessionInterruptionType.ended e riprovare l’attivazione.
La modalità perfeziona la categoria e ottimizza il percorso audio per un caso d’uso specifico. Ogni modalità modifica il comportamento di AGC, cancellazione dell’eco e codec. Le modalità non sostituiscono la categoria ma la completano — una categoria può funzionare con diverse modalità.
Le opzioni forniscono una regolazione fine del comportamento della sessione. Ogni opzione è un flag che può essere combinato con altri in un array. Ad esempio, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] consente l’uscita audio verso un auricolare Bluetooth, utilizza l’altoparlante per impostazione predefinita e si mescola con gli audiolibri.
Su iOS 17+ è apparsa l’opzione spatialAudio, che attiva l’audio spaziale personalizzato per AirPods tramite AVAudioSessionSpatialPreferences. Secondo il WWDC 2024, l’audio spaziale aumenta il coinvolgimento degli utenti nelle app musicali del 25% nei test Apple.
Le interruzioni sono una differenza chiave tra Audio Session e Android Audio Focus. In iOS, le interruzioni vengono gestite tramite NotificationCenter sottoscrivendo AVAudioSession.interruptionNotification. La notifica contiene un dizionario con il tipo di interruzione: began o 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()
}
}
Al ricevimento di interruptionType.began, il lettore dovrebbe mettere in pausa la riproduzione. Al ricevimento di interruptionType.ended, la proprietà interruptionOptionKey indica se il lettore può riprendere automaticamente (shouldResume). Se l’utente ha rifiutato la chiamata, shouldResume = true. Se la chiamata è terminata per timeout — shouldResume = false, la ripresa non è consentita.
Quando un’altra app attiva la sua Audio Session con la categoria playback, la sessione corrente riceve una notifica di interruzione. Se un’altra app utilizza ambient, non si verifica alcuna interruzione — i suoni vengono mescolati. Questo comportamento è drasticamente diverso da Android, dove qualsiasi attivazione di Audio Focus attiva un evento LOSS.
Per le app che devono continuare la riproduzione quando altre sessioni vengono attivate (ad esempio, navigazione mentre la musica è in riproduzione), utilizzare l’opzione .mixWithOthers. Questa opzione consente la miscelazione del suono con altre app e non vengono inviate interruzioni. MixWithOthers è l’equivalente iOS della modalità duck in Android.
Audio Session gestisce automaticamente l’instradamento audio tra altoparlanti integrati, cuffie, auricolari Bluetooth e dispositivi AirPlay. L’app può monitorare il percorso corrente tramite la proprietà currentRoute e ricevere notifiche sulle modifiche tramite AVAudioSession.routeChangeNotification.
Quando vengono collegate cuffie Bluetooth, iOS commuta automaticamente l’uscita audio su di esse se la sessione è configurata con l’opzione allowBluetooth. Senza questa opzione, il suono continua attraverso l’altoparlante integrato. A partire da iOS 16, quando si collegano AirPods Pro, il sistema attiva automaticamente la sincronizzazione ProMotion per ridurre la latenza.
Sottoscriversi a routeChangeNotification consente di reagire alla connessione e disconnessione delle cuffie. Quando un auricolare Bluetooth viene disconnesso, il lettore dovrebbe mettere in pausa la riproduzione — l’utente potrebbe non aspettarsi che il suono inizi a provenire dall’altoparlante del telefono. Secondo Apple HIG (2026), questo è un comportamento obbligatorio per le app musicali.
Le proprietà availableInputs e availableOutputs restituiscono un elenco di dispositivi audio disponibili con i loro tipi (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Lo sviluppatore può selezionare programmaticamente un dispositivo specifico tramite overrideOutputAudioPort per scenari di instradamento personalizzati.
Domande Frequenti
La differenza principale è l’architettura. Audio Session è una singola sessione centralizzata per app configurata una volta. Android Audio Focus richiede una richiesta manuale del focus ogni volta che si riproduce. Inoltre, iOS supporta la miscelazione tramite l’opzione mixWithOthers, mentre in Android duck è l’unica alternativa all’arresto completo.
La causa più comune è una categoria Audio Session errata. Se è selezionato ambient o soloAmbient, il suono si interrompe quando lo schermo viene bloccato. Passare la categoria a playback e assicurarsi che Background Modes — Audio, AirPlay, and Picture in Picture sia aggiunto in Info.plist.
Aggiungere l’opzione .mixWithOthers a setCategory. Ciò consentirà di mescolare il suono della tua app con altre sessioni attive. Senza questa opzione, una nuova app interrompe quella corrente. MixWithOthers è l’analogo della modalità duck in Android, ma con piena preservazione del volume.
Utilizzare overrideOutputAudioPort con nil per la selezione automatica. Per uscita forzata su Bluetooth: ottenere AVAudioSessionRouteDescription da availableOutputs, selezionare una porta con tipo .bluetoothA2DP e passarla a overrideOutputAudioPort. Assicurarsi che la sessione sia configurata con allowBluetooth.
Per la maggior parte delle app — sì. Disattivare la sessione in pausa consente ad altre app di ottenere il focus audio. L’eccezione sono i lettori musicali con riproduzione prolungata in background. Se la pausa è breve (meno di 5 secondi), è meglio mantenere la sessione attiva per una ripresa rapida.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche