Audio Session — cos’è, categorie e configurazione in iOS

Autore: IT Sectr Pubblicato: 2026-05-24 Tempo di lettura: 8 min

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 (AVAudioSession) è un oggetto di sistema in iOS che gestisce il comportamento audio dell’app a livello di sistema operativo.
  • La categoria della sessione definisce il comportamento di base: playback, record, ambient, playAndRecord e altri.
  • Le modalità e le opzioni perfezionano il comportamento: default, voiceChat, videoRecording, allowBluetooth.
  • In caso di interruzione (chiamata, sveglia), la sessione riceve una notifica tramite NotificationCenter con il tipo interruptionType.
  • Per la riproduzione in background, è necessario attivare Background Modes — Audio, AirPlay and Picture in Picture.

Cos’è Audio Session?

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.

Come Funziona AVAudioSession

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.

Categorie di Audio Session

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.

CategoriaQuando UsarlaAudio in BackgroundSilenzioso Influisce
ambientGiochi, effetti di sfondoNo
playbackMusica, podcast, audiolibriNo
recordMemo vocali, registrazione audioNoN/D
playAndRecordVoIP, messaggi vocaliNo
multiRouteMixer DJ, karaokeNo
soloAmbientPredefinito (iOS default)No

Categoria Playback — la Scelta Principale per i Lettori

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.

Come Configurare Audio Session

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.

Configurazione di Base di Audio Session in Swift

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

Configurazione per Registrazione e Riproduzione (VoIP)

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

Attivazione e Disattivazione della Sessione

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.

Modalità e Politiche di Audio Session

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

  • default — modalità standard per musica e video. AGC disattivato, cancellazione dell’eco minima.
  • voiceChat — ottimizzazione per VoIP. Attiva cancellazione dell’eco, AGC, soppressione del rumore. Utilizzare con la categoria playAndRecord.
  • videoRecording — per registrazione video. Dà priorità alla qualità di registrazione rispetto alla riproduzione. Utilizzare con la categoria record o playAndRecord.
  • measurement — per misurazioni audio. Elaborazione minima del segnale, nessun AGC o cancellazione dell’eco.
  • gameChat — per chat vocale nei giochi. Simile a voiceChat, ma con priorità per l’audio del gioco.
  • moviePlayback — per guardare film. Ottimizzazione per audio multicanale (5.1, 7.1) e Dolby Atmos.

Opzioni di Categoria di Audio Session

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.

Gestione delle Interruzioni e delle Chiamate

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.

Sottoscrizione alle Notifiche di Interruzione

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

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.

Gestione delle Interruzioni da Altre App

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.

Instradamento Audio e Bluetooth

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.

Monitoraggio delle Modifiche del Percorso

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

In cosa differisce Audio Session da Android Audio Focus?

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.

Perché il suono scompare quando lo schermo dell’iPhone viene bloccato?

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.

Come consentire a due app di riprodurre simultaneamente su iOS?

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.

Come commutare programmaticamente il suono su un altoparlante Bluetooth?

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.

Dovrei chiamare setActive(false) quando metto in pausa il lettore?

Per la maggior parte delle app — . 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

  • Audio Session (AVAudioSession) è la singola sessione audio per app in iOS che gestisce il comportamento del suono a livello di sistema operativo.
  • Sei categorie: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — definiscono il comportamento audio di base.
  • Per la riproduzione in background, sono obbligatori la categoria playback e Background Modes in Info.plist.
  • Le interruzioni vengono gestite tramite NotificationCenter con i tipi began (pausa) ed ended (ripresa quando shouldResume).
  • L’opzione .mixWithOthers attiva la miscelazione del suono con altre app senza interruzione.
  • L’instradamento è gestito automaticamente ma monitorato tramite routeChangeNotification per mettere in pausa quando le cuffie vengono disconnesse.
  • La categoria playAndRecord con modalità voiceChat è lo standard per le app VoIP con cancellazione dell’eco e AGC.

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.

Discuti il progetto

Leggi anche