Ecco la soluzione: -
Se la vostra applicazione è un'applicazione mobile basata luogo che ha bisogno di monitorare la posizione del dispositivo quando ha cambiamenti significativi, l'iOS ti restituirà alcune coordinate di posizione quando il dispositivo si è spostato a più di 500 metri dall'ultima posizione nota. Sì, anche quando l'app viene uccisa/sospesa dall'utente o da iOS, è comunque possibile ottenere gli aggiornamenti della posizione.
Quindi, per ottenere un aggiornamento della posizione per locationManager
anche quando l'app viene uccisa/sospesa, è necessario utilizzare il metodo startMonitoringSignificantLocationChanges
, non è possibile utilizzare startUpdatingLocation
.
Quando iOS vuole restituire l'aggiornamento della posizione all'app, ti aiuterà a riavviare l'app e restituire una chiave UIApplicationLaunchOptionsLocationKey
al metodo delegato dell'app didFinishLaunchingWithOptions
.
La chiave UIApplicationLaunchOptionsLocationKey
è molto importante e devi sapere come gestirla. È necessario creare una nuova istanza locationManager quando si riceve la chiave e si otterrà l'aggiornamento della posizione sul metodo delegato locationManager didUpdateLocations
.
Ecco il codice di esempio: -
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
self.shareModel = [LocationShareModel sharedModel];
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
return YES;
}
Oltre al metodo didFinishLaunchingWithOptions
, ho creato l'istanza locationManager
quando l'applicazione è attiva. Ecco alcuni esempi di codice:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(self.shareModel.anotherLocationManager)
[self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];
self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
if(IS_OS_8_OR_LATER) {
[self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}
Ho scritto un articolo che spiega sui dettagli su come ottenere l'aggiornamento posizione per iOS 7 e 8 anche quando l'applicazione viene ucciso/sospesa. Ho anche caricato il codice sorgente completo su GitHub con i passaggi su come testare questa soluzione.
Si prega di visitare i seguenti URL per maggiori informazioni: -
- Getting Location Updates for iOS 7 and 8 when the App is Killed/Terminated/Suspended
- Source Code on GitHub - Get the Location Updates Even when the iOS mobile apps is Suspended/Terminated/Killed
"È necessario creare una nuova istanza locationManager quando si riceve la chiave" - Sembra un po 'di confusione, intendi esattamente "NUOVA istanza di locationManager"? Ho una istanza condivisa di locationManager nel mio progetto - posso solo riutilizzarla? –
Buona domanda. Quando l'app è sospesa, anche il locationManager condiviso creato in precedenza verrà cancellato dalla memoria. Come riutilizzare un'istanza che non esiste nella memoria? Quindi, creare una nuova istanza è l'unico modo. – Ricky
Ciao Ricky, ottima risposta. Solo una domanda: lo stesso metodo può essere applicato al gestore di localizzazione standard rispetto al solo gestore di posizioni di modifica significativo? – Pacemaker