Background Modes sono un insieme di capacità dichiarabili di iOS che consentono a un’app di continuare a eseguire codice dopo essere passata in background. Ogni modalità corrisponde a un tipo specifico di attività: audio, geolocalizzazione, VoIP, Bluetooth, fetch e processing. Secondo Apple, 2026, l’uso improprio dei Background Modes è una delle cause comuni di rifiuto delle app durante la revisione nell’App Store.
Punti chiave
Background Modes sono capacità del progetto Xcode che dichiarano l’intenzione dell’app di eseguire tipi specifici di operazioni in background. A differenza di Android, dove un’app può avviare qualsiasi Service in background, iOS richiede una dichiarazione esplicita della modalità in Info.plist. Ogni modalità ha regole di utilizzo rigorose e viene verificata da Apple durante la revisione.
Quando un’app passa in background, iOS la sospende entro 3–5 secondi. Se l’app dichiara una Background Mode e utilizza attivamente l’API corrispondente (ad esempio AVAudioSession per l’audio), il sistema la inserisce in una modalità di esecuzione speciale. L’app rimane in memoria e può eseguire codice limitato dal tipo di modalità.
iOS supporta le seguenti Background Modes: Audio, Posizione, VoIP, Bluetooth LE (accessori BLE), Background Fetch (aggiornamenti periodici), Background Processing (attività lunghe), External Accessory Communication, Push to Talk (PTT) e HealthKit. Ogni modalità richiede una giustificazione nella descrizione dell’app.
| Modalità | Chiave Info.plist | Scopo | Versione iOS |
|---|---|---|---|
| Audio | audio | Audio in background, AirPlay | 4.0+ |
| Location | location | Tracciamento posizione | 4.0+ |
| VoIP | voip | Notifiche push VoIP | 4.0+ |
| BLE | bluetooth-central | Lavoro con dispositivi BLE | 7.0+ |
| Fetch | fetch | Download periodico di dati | 7.0+ |
| Processing | processing | Attività lunghe in background | 13.0+ |
| Push to Talk | push-to-talk | Voce push-to-talk | 16.0+ |
Modalità Audio in Background è la modalità più comune, utilizzata da lettori musicali, app di podcast e servizi audio. L’app può continuare la riproduzione audio, essere controllata tramite il Centro di Controllo e apparire sulla schermata di blocco. Per attivarla, è sufficiente configurare AVAudioSession con la categoria .playback.
Affinché l’audio funzioni in background, è necessario configurare AVAudioSession e attivarla. La categoria .playback indica al sistema che l’app sta riproducendo audio e deve rimanere attiva in background. Senza questa configurazione, l’audio si fermerà 5–10 secondi dopo aver minimizzato l’app.
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("Errore sessione audio: \(error)")
}
}
Per l’integrazione con il Centro di Controllo e la schermata di blocco, è necessario configurare MPRemoteCommandCenter. Gestisce i comandi Play, Pausa, Successivo e Precedente. È inoltre necessario aggiornare MPNowPlayingInfoProperty per visualizzare i metadati: nome del brano, artista, copertina e stato di avanzamento della riproduzione.
A partire da iOS 14, la Modalità Audio in Background supporta anche Picture in Picture per i video. L’app può continuare a mostrare il video in una finestra fluttuante quando viene minimizzata. Per attivarlo, utilizzare AVPictureInPictureController con AVPlayerLayer. Questa modalità funziona solo se l’app sta riproducendo una traccia audio.
Modalità Posizione in Background consente all’app di ricevere aggiornamenti di posizione in background. Viene utilizzata in app di navigazione, tracker fitness, app di consegna e social network. Senza questa modalità, l’app riceve la posizione solo una volta quando passa in background, dopodiché gli aggiornamenti si fermano.
CLLocationManager supporta diverse strategie di tracciamento: cambiamenti significativi di posizione, tracciamento standard e monitoraggio di regioni. Per lavorare in background con la massima precisione, utilizzare allowsBackgroundLocationUpdates = true e pausesLocationUpdatesAutomatically = false.
Il tracciamento continuo della posizione in background è uno degli scenari a maggiore consumo energetico. iOS regola automaticamente la frequenza degli aggiornamenti in base alla velocità di movimento: camminando, aggiornamenti ogni 10–30 secondi; guidando, ogni 1–5 secondi. Per la navigazione, utilizzare desiredAccuracy = kCLLocationAccuracyBestForNavigation.
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
La modalità significant-change location funziona senza la Modalità Posizione in Background — il sistema riattiva l’app solo quando le coordinate cambiano significativamente (di solito 500 m o più). Non richiede GPS costante, risparmiando batteria. Adatta per app meteo che aggiornano i dati quando l’utente si sposta.
Modalità Bluetooth LE in Background consente all’app di interagire con dispositivi BLE in background. Viene utilizzata da braccialetti fitness, sensori medici, dispositivi Smart Home e navigazione tramite beacon. La modalità si divide in due sottotipi: bluetooth-central (l’app si connette ai dispositivi) e bluetooth-peripheral (l’app funge da dispositivo).
Un’app che funge da Central può scansionare e connettersi a dispositivi BLE in background. Per farlo, specificare bluetooth-central in Background Modes e chiamare CBCentralManager.scanForPeripherals con l’opzione CBCentralManagerScanOptionAllowDuplicatesKey. In background, la scansione funziona a frequenza ridotta — il sistema può ritardare la scoperta per risparmiare energia.
Un’app che funge da Peripheral può annunciare servizi e rispondere alle richieste di altri dispositivi. La modalità bluetooth-peripheral consente all’app di rimanere visibile ad altri dispositivi BLE anche in background. Viene utilizzata nelle app HealthKit e nelle soluzioni IoT.
Il monitoraggio iBeacon funziona in background senza autorizzazioni aggiuntive — il sistema stesso tiene traccia dell’ingresso e dell’uscita dalle regioni Beacon. Tuttavia, per scansionare il contenuto del Beacon (UUID di prossimità, major, minor), sono necessari l’autorizzazione Bluetooth e la modalità bluetooth-central Background Mode. Utilizzare CLLocationManager con CLBeaconRegion per il monitoraggio.
Modalità VoIP in Background è progettata per app di comunicazione vocale (Skype, Zoom, WhatsApp). Questa modalità consente all’app di rimanere connessa al server per ricevere chiamate in arrivo. A partire da iOS 8, per VoIP viene utilizzato PushKit — un framework che gestisce le notifiche push dal server VoIP senza coinvolgere APNs.
PushKit è l’unico meccanismo che garantisce la consegna delle notifiche VoIP al dispositivo. Alla ricezione di una notifica PushKit, il sistema riattiva l’app, anche se era stata terminata. L’app deve stabilire una connessione con il server entro 30 secondi e mostrare una notifica locale per la chiamata in arrivo.
import PushKit
class VoIPHandler: NSObject, PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void
) {
let caller = payload.dictionaryPayload["caller"] as! String
reportIncomingCall(from: caller)
completion()
}
}
PushKit non può essere utilizzato per notifiche ordinarie — solo per VoIP, comunicazioni watchOS e provider di file. Apple verifica questo durante la revisione. L’uso improprio porta al rifiuto dell’app. A partire da iOS 13, PushKit consegna solo la notifica — è obbligatorio chiamare CXProvider (CallKit) per visualizzare la schermata di chiamata.
Background Fetch e Background Processing sono modalità per aggiornamenti di contenuto in background e attività lunghe. Fetch è per aggiornamenti periodici brevi (fino a 30 s), Processing è per attività lunghe (fino a 10 min) con condizioni (Wi-Fi, ricarica). Processing è disponibile solo su iOS 13+.
La modalità Fetch consente al sistema di riattivare periodicamente l’app per scaricare nuovi contenuti. Il sistema analizza il comportamento dell’utente e seleziona il momento ottimale. L’app deve chiamare il completion handler entro 30 secondi. Fetch è adatto per app di notizie, feed di social media e meteo.
BGProcessingTask è progettata per attività che possono essere eseguite senza intervento dell’utente: pulizia della cache, sincronizzazione di database di grandi dimensioni, elaborazione di file multimediali. Il sistema avvia l’attività solo in condizioni favorevoli — dispositivo in carica, connesso al Wi-Fi, non in modalità basso consumo. Disponibile fino a 10 minuti.
Per BGProcessingTask, è necessario specificare requiresExternalPower e requiresNetworkConnectivity. Il sistema può rimandare l’esecuzione a tempo indeterminato se le condizioni non sono soddisfatte. A differenza di BGAppRefreshTask, che deve essere eseguito almeno una volta al giorno, Processing potrebbe non essere eseguito per settimane se il dispositivo viene caricato raramente.
Apple verifica rigorosamente l’uso dei Background Modes durante la revisione delle app. La regola principale: ogni modalità attivata deve essere giustificata dalla funzionalità dell’app. Se un’app dichiara la Modalità Posizione ma non utilizza la geolocalizzazione, verrà rifiutata con la richiesta di rimuovere la capacità.
Le violazioni più comuni: Modalità Posizione senza necessità esplicita (l’app richiede l’accesso “Sempre” per mostrare pubblicità), Modalità Audio senza riproduzione audio in background, VoIP senza PushKit, Modalità BLE senza dispositivi Bluetooth. Apple può rifiutare l’app anche in fase di aggiornamento se la modalità non viene più utilizzata.
Quando si invia per la revisione, fornire una giustificazione specifica per ogni modalità nelle Note. Ad esempio, “La Modalità Posizione in Background viene utilizzata per tracciare il percorso dell’utente nella funzionalità fitness.” Senza spiegazione, il revisore può rifiutare l’app. Per funzionalità riservate (VoIP), Apple può richiedere un account di test.
Utilizzare il set minimo necessario di modalità. Se la tua app necessita di download di dati in background una volta all’ora — non attivare la Modalità Posizione, utilizzare Fetch o BGAppRefreshTask. Le modalità extra non solo portano al rifiuto, ma creano anche un’impressione negativa: l’utente vede nelle Impostazioni che l’app utilizza la geolocalizzazione in background.
Domande frequenti
Non c’è limite al numero, ma ogni modalità deve essere giustificata dalla funzionalità dell’app. Attivare tutte le modalità senza necessità è un motivo garantito di rifiuto durante la revisione. Un limite pratico è di 2–3 modalità per app, altrimenti l’utente vedrà numerose richieste di autorizzazione.
Utilizzare UIApplication.shared.applicationState — l’app può verificare se è in background (state == .background). È possibile anche osservare le notifiche UIApplication.didEnterBackgroundNotification e willEnterForegroundNotification per cambiare comportamento.
Audio — riproduzione del suono attraverso l’altoparlante o le cuffie. AirPlay — streaming audio e video verso Apple TV e altri dispositivi AirPlay. In pratica, la Modalità Audio copre entrambi gli scenari poiché AirPlay utilizza la sessione audio. Una modalità AirPlay separata non è richiesta da iOS 7+.
Sì, per questo utilizzare requestWhenInUseAuthorization() invece di requestAlwaysAuthorization(). L’app riceverà la posizione solo in primo piano. Se è necessario un breve tracciamento in background, chiamare startUpdatingLocation() e fermarlo in willResignActive.
Ogni modalità aumenta il consumo energetico. La Modalità Posizione è la più esigente, può ridurre la durata della batteria del 30–50% con tracciamento continuo. La Modalità Audio è moderata (15–20%). Fetch e Processing sono minimi (2–5%). La Modalità BLE è bassa (5–10%) grazie all’efficienza energetica del Bluetooth LE.
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