J'écris une application qui nécessite des mises à jour de l'emplacement en arrière-plan avec une grande précision et une faible fréquence . La solution semble être une tâche NSTimer en arrière-plan qui démarre les mises à jour du gestionnaire d'emplacement, qui s'arrête immédiatement. Cette question a déjà été posée:
iOS Pas le problème typique du minuteur de suivi de l'emplacement en arrière-plan
Minuterie d'arrière-plan iOS de longue durée avec mode d'arrière-plan "emplacement"
Service d'arrière-plan iOS à plein temps basé sur le suivi de l'emplacement
mais je n'ai pas encore fait fonctionner un exemple minimum . Après avoir essayé toutes les permutations des réponses acceptées ci-dessus, j'ai établi un point de départ. Entrer en arrière-plan:
- (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];
}
et la méthode des délégués:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
Le comportement actuel est que les backgroundTimeRemaining
décrémentations de 180 secondes à zéro (lors de la journalisation de l'emplacement), puis le gestionnaire d'expiration s'exécute et aucune autre mise à jour d'emplacement n'est générée. Comment puis-je modifier le code ci-dessus afin de recevoir des mises à jour périodiques de l'emplacement en arrière-plan indéfiniment ?
Mise à jour : je cible iOS 7 et il semble y avoir des preuves que les tâches d'arrière-plan se comportent différemment:
Démarrez Location Manager dans iOS 7 à partir de la tâche en arrière-plan