Questa è la sezione della documentazione di CLLocationManager che descrive il comportamento dell'app con startMonitoringSignificantLocationChanges :
Se avvii questo servizio e la tua applicazione viene successivamente chiusa, il sistema riavvia automaticamente l'applicazione in background se arriva un nuovo evento. In tal caso, il dizionario delle opzioni passato all'applicazione: didFinishLaunchingWithOptions: il metodo del delegato dell'applicazione contiene la chiave UIApplicationLaunchOptionsLocationKey per indicare che l'applicazione è stata avviata a causa di un evento di posizione. Al riavvio, è comunque necessario configurare un oggetto gestore di posizione e chiamare questo metodo per continuare a ricevere eventi di posizione. Quando si riavvia i servizi di localizzazione, l'evento corrente viene consegnato immediatamente al delegato. Inoltre, la proprietà della posizione dell'oggetto del gestore della posizione viene popolata con l'oggetto della posizione più recente anche prima di avviare i servizi di posizione.
Quindi la mia comprensione è che se la tua app termina (e presumo se non chiami stopMonitoringSignificantLocationChanges da applicationWillTerminate ) verrai svegliato con un parametro UIApplicationLaunchOptionsLocationKey per application: didFinishLaunchingWithOptions . A quel punto crei il tuo CLLocationManager , chiama startMonitoringSignificantLocationChanges ed esegui l'elaborazione della posizione in background per un periodo di tempo limitato . Quindi sto bene con questo pezzo.
Il paragrafo precedente parla solo di cosa succede quando l'app viene chiusa, non suggerisce cosa fare quando l'applicazione viene sospesa. La documentazione per didFinishLaunchingWithOptions dice:
L'applicazione tiene traccia degli aggiornamenti della posizione in background, è stata eliminata e ora è stata riavviata. In questo caso, il dizionario contiene una chiave che indica che l'applicazione è stata riavviata a causa di un nuovo evento di posizione.
Suggerendo che riceverai questa chiamata solo quando la tua app verrà avviata (a causa di un cambio di posizione) dopo essere stato terminato.
Tuttavia, il paragrafo sul Servizio di cambiamento significativo nella Guida alla programmazione per la conoscenza della posizione ha quanto segue da dire:
Se lasci questo servizio in esecuzione e la tua applicazione viene successivamente sospesa o terminata, il servizio riattiva automaticamente l'applicazione quando arrivano nuovi dati sulla posizione. Al momento della sveglia, la tua applicazione viene messa in background e ha poco tempo per elaborare i dati sulla posizione. Poiché l'applicazione è in background, dovrebbe svolgere un lavoro minimo ed evitare qualsiasi attività (come l'interrogazione della rete) che potrebbe impedirne il ritorno prima della scadenza del tempo assegnato. In caso contrario, l'applicazione potrebbe essere chiusa.
Ciò suggerisce che sei svegliato con i dati sulla posizione se la tua app è stata sospesa, ma non menziona come sei stato svegliato:
- Fa l'UIApplicationDelegate ottenere un callback che mi diceva che io riprendo da uno stato sospeso in uno stato di fondo?
- Il gestore della posizione (che è stato congelato quando l'app è stata sospesa) inizia a ricevere locationManager: didUpdateToLocation: fromLocation callback?
- Devo solo implementare il codice nel mio messaggio didUpdateToLocation che controlla lo stato dell'applicazione ed esegue un'elaborazione minima se in modalità background?
Nel processo di stesura di questo, penso di aver appena risposto alla mia domanda, ma sarebbe fantastico se la mia comprensione di ciò fosse confermata da qualcuno più informato.