Voici la section de la documentation CLLocationManager décrivant le comportement de l'application avec startMonitoringSignificantLocationChanges :
Si vous démarrez ce service et que votre application est par la suite arrêtée, le système relance automatiquement l'application en arrière-plan si un nouvel événement arrive. Dans un tel cas, le dictionnaire d'options passé à l'application: didFinishLaunchingWithOptions: méthode de votre délégué d'application contient la clé UIApplicationLaunchOptionsLocationKey pour indiquer que votre application a été lancée en raison d'un événement de localisation. Lors du redémarrage, vous devez toujours configurer un objet de gestionnaire d'emplacement et appeler cette méthode pour continuer à recevoir des événements d'emplacement. Lorsque vous redémarrez les services de localisation, l'événement en cours est remis à votre délégué immédiatement. En outre, la propriété d'emplacement de votre objet de gestionnaire d'emplacement est remplie avec l'objet d'emplacement le plus récent avant même de démarrer les services de localisation.
Donc, je crois comprendre que si votre application se termine (et je suppose que si vous n'appelez pas stopMonitoringSignificantLocationChanges depuis applicationWillTerminate ), vous serez réveillé avec un paramètre UIApplicationLaunchOptionsLocationKey à application: didFinishLaunchingWithOptions . À ce stade, vous créez votre CLLocationManager , appelez startMonitoringSignificantLocationChanges et effectuez le traitement de votre emplacement en arrière-plan pendant une durée limitée . Donc je suis d'accord avec ce morceau.
Le paragraphe précédent ne parle que de ce qui se passe lorsque l'application est arrêtée, il ne suggère pas ce que vous faites lorsque l'application est suspendue. La documentation de didFinishLaunchingWithOptions dit:
L'application suit les mises à jour d'emplacement en arrière-plan, a été purgée et a maintenant été relancée. Dans ce cas, le dictionnaire contient une clé indiquant que l'application a été relancée en raison d'un nouvel événement de localisation.
Suggérer que vous ne recevrez cet appel que lorsque votre application sera lancée (en raison d'un changement d'emplacement) après la résiliation.
Cependant, le paragraphe sur le service de changement significatif dans le Guide de programmation de la détection de l' emplacement a ce qui suit:
Si vous laissez ce service en cours d'exécution et que votre application est par la suite suspendue ou résiliée, le service réveille automatiquement votre application lorsque de nouvelles données de localisation arrivent. Au moment du réveil, votre application est mise en arrière-plan et dispose d'un peu de temps pour traiter les données de localisation. Étant donné que votre application est en arrière-plan, elle doit effectuer un travail minimal et éviter toutes les tâches (telles que l'interrogation du réseau) qui pourraient l'empêcher de revenir avant l'expiration du délai alloué. Si ce n'est pas le cas, votre application peut être résiliée.
Cela suggère que vous êtes réveillé avec des données de localisation si votre application a été suspendue, mais ne mentionne pas comment vous vous êtes réveillé:
- Le UIApplicationDelegate obtenir un rappel en me disant que je reprends à partir d' un état suspendu dans un état d'arrière - plan?
- Le gestionnaire d'emplacement (qui a été lyophilisé lorsque l'application a été suspendue) commence-t-il à recevoir des rappels locationManager: didUpdateToLocation: fromLocation ?
- Dois-je simplement implémenter du code dans mon message didUpdateToLocation qui vérifie l'état de l'application et effectue un traitement minimal en mode arrière-plan?
En rédigeant ceci, je pense que je viens de répondre à ma propre question, mais ce serait formidable que ma compréhension de cela soit confirmée par quelqu'un de plus compétent.