J'ai fait cela dans une application que je suis en train de développer. Les minuteries ne fonctionnent pas lorsque l'application est en arrière-plan, mais l'application reçoit constamment les mises à jour de la localisation. J'ai lu quelque part dans la documentation (je ne peux pas le trouver maintenant, je posterai une mise à jour quand je l'aurai fait) qu'une méthode peut être appelée seulement sur une boucle d'exécution active quand l'application est en arrière-plan. Le délégué de l'application a une boucle d'exécution active même en arrière-plan, donc vous n'avez pas besoin de créer la vôtre pour que cela fonctionne. [Je ne suis pas sûr que ce soit la bonne explication mais c'est ce que j'ai compris de ce que j'ai lu].
Tout d'abord, ajoutez le location
pour la clé UIBackgroundModes
dans le fichier info.plist de votre application. Il ne vous reste plus qu'à lancer les mises à jour de la localisation n'importe où dans votre application :
CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;//or whatever class you have for managing location
[locationManager startUpdatingLocation];
Ensuite, écrivez une méthode pour gérer les mises à jour de l'emplacement, disons -(void)didUpdateToLocation:(CLLocation*)location
dans le délégué de l'application. Ensuite, implémentez la méthode locationManager:didUpdateLocation:fromLocation
de CLLocationManagerDelegate
dans la classe dans laquelle vous avez lancé le gestionnaire d'emplacement (puisque nous avons défini le délégué du gestionnaire d'emplacement sur "self"). Dans cette méthode, vous devez vérifier si l'intervalle de temps après lequel vous devez gérer les mises à jour de l'emplacement s'est écoulé. Vous pouvez le faire en sauvegardant l'heure actuelle à chaque fois. Si ce délai est écoulé, appelez la méthode UpdateLocation à partir du délégué de votre application :
NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;
int locationUpdateInterval = 300;//5 mins
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {
lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];
if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
//NSLog(@"New Location: %@", newLocation);
[(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
[userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
}
}
}
Cela appellera votre méthode toutes les 5 minutes, même si votre application est en arrière-plan. Imp : Cette implémentation draine la batterie, si la précision de vos données de localisation n'est pas critique, vous devriez utiliser la méthode suivante [locationManager startMonitoringSignificantLocationChanges]
Avant d'ajouter cette fonction à votre application, veuillez lire le document Guide de programmation de la géolocalisation
0 votes
Duplicata possible de pour faire tourner l'application en permanence en arrière-plan
0 votes
Suivi utile : stackoverflow.com/questions/10235203/
1 votes
Si vous essayez de le faire fonctionner sous iOS 7, vous pouvez essayer cette solution ici : stackoverflow.com/questions/18946881/ Si vous avez des questions, nous vous invitons à nous rejoindre pour une discussion ici : mobileoop.com/background-location-update-programming-for-ios-7
1 votes
Toutes vos conclusions sont correctes (les quatre points). Des informations précieuses qui sont donc, sachant ce qui ne correspond pas à votre cas d'utilisation ? Et oui, en mode SUSPENDED ou NOT RUNNING, il n'y a pas de méthode ultime pour mettre à jour toutes les n-minutes.