Je me bats avec ce problème depuis un certain temps, et je pense que j'ai enfin trouvé la solution
Si le service de localisation ne s'arrête pas lorsque vous le lui demandez, ce n'est pas parce que vous ne l'avez pas arrêté ou libéré correctement. D'après mon expérience, le problème est causé par la libération et la réaffectation du CLLocationManager lui-même.
Si votre code libère votre CLLocationManager dans applicationDidEnterBackground, puis en alloue un nouveau dans applicationDidEnterForeground, etc., vous aurez probablement ce problème.
La solution est la suivante :
- Ne créez votre objet CLLocationManager qu'une seule fois, dans l'applicationDidFinishLaunching.
- Pour commencer, appelez startUpdatingLocation, startMonitoringSignificantLocationChanges etc. comme d'habitude.
- Pour arrêter les mises à jour, appelez normalement les fonctions appropriées stopUpdatingLocation, stopMonitoringSignificantLocationChanges, etc.
- Ne relâchez jamais, au grand jamais, votre CLLocationManager et ne mettez jamais sa référence à nil (sauf peut-être dans l'applicationWillTerminate, mais cela ne fera probablement aucune différence).
De cette façon, je suis passé d'une situation où mon application continuait à utiliser les services de localisation jusqu'à 12 heures après la mise en arrière-plan de mon application, à une situation où la flèche des services de localisation disparaissait dans les 10 secondes suivant la mise en arrière-plan avec cette nouvelle approche.
Remarque : testé sur un iPhone 4S fonctionnant sous iOS 5.1.1. Pour obtenir des résultats précis sur les performances de votre application à cet égard, assurez-vous d'aller dans Réglages->Services de localisation->Services système et de désactiver l'interrupteur de l'icône de la barre d'état. De cette façon, la flèche de la barre d'état reflétera précisément l'utilisation des applications seules.