Sto scrivendo un'applicazione che richiede aggiornamenti della posizione in background con elevata precisione e bassa frequenza . La soluzione sembra essere un'attività NSTimer in background che avvia gli aggiornamenti del gestore della posizione, che quindi si spegne immediatamente. Questa domanda è stata posta in precedenza:
Ottenere la posizione dell'utente ogni n minuti dopo che l'app è passata in background
iOS Non è il tipico problema del timer di rilevamento della posizione in background
Timer in background iOS di lunga durata con modalità in background "location"
Servizio in background iOS a tempo pieno basato sul rilevamento della posizione
ma devo ancora ottenere un minimo di esempio funzionante. Dopo aver provato ogni permutazione delle risposte accettate sopra, ho messo insieme un punto di partenza. Inserimento dello sfondo:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self.locationManager
selector:@selector(startUpdatingLocation)
userInfo:nil
repeats:YES];
}
e il metodo delegato:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
Il comportamento corrente è che il valore backgroundTimeRemaining
diminuisce da 180 secondi a zero (durante la registrazione della posizione), quindi viene eseguito il gestore della scadenza e non vengono generati ulteriori aggiornamenti della posizione. Come posso modificare il codice precedente per ricevere aggiornamenti periodici sulla posizione in background a tempo indeterminato ?
Aggiornamento : sto prendendo di mira iOS 7 e sembra che ci siano alcune prove che le attività in background si comportano in modo diverso:
Avvia Gestione posizione in iOS 7 dall'attività in background