startMonitoringSignificantLocationChanges mais après un certain time, didUpdateLocations n'est plus appelé

J'ai un comportement très étrange. J'écris une application qui utilise à la fois le mode d'extraction et le mode d'arrière-plan de localization (ne le savez pas, c'est important pour le problème). Je configure correctement le CLLocationManager avec un délégué et je commence à surveiller les changements d'location significatifs ( startMonitoringSignificantLocationChanges ) dans AppDelegate. Immédiatement, je me suis appelé didUpdateLocations qui me donne quelques endroits. Après cela, plus aucun événement n'est déclenché, même si je simule un location différent dans Xcode (en utilisant également un file GPX) et même si j'arrête et redémarre la surveillance. Je ne reçois aucun location en arrière-plan et au premier plan.

La chose étrange est que si je commence à mettre à jour les locations (en utilisant le GPS), cela fonctionne correctement (en faisant les mêmes tests … en démarrant et en s'arrêtant exactement comme avec startMonitoringSignificantLocationChanges). Évidemment, j'ai à la fois didUpdateLocations et didFailWithError (je ne reçois aucune erreur).

C'est mon initialisation (appelée par l'initialisation d'un object dans mon AppDelegate didFinishLaunchWithOptions):

self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.pausesLocationUpdatesAutomatically = NO; 

Je sais que distanceFilter et la précision ne sont pas importants pour les changements de localization significatifs et j'ai déjà mis pausesLocationUpdatesAutomatiquement à NO.

Est-ce que je manque quelque chose? Et existe-t-il aussi un moyen de lire si un location provient du wifi, du cellulaire ou du gps?

Merci d'avance.

Vous pouvez simuler l'location d'un changement significatif sur le simulateur uniquement avec l'option «conduite d'autoroute» du menu Emplacement du simulateur. Il sera déclenché avec quelques minutes d'intervalle.

Allouer le gestionnaire sur le thread principal et vérifier si le gestionnaire ou l'application a toujours des permissions pourraient faire l'affaire. La note de documentation d'Apple est:

Remarque: Les mises à jour d'location à changement important nécessitent un statut d'autorisation de kCLAuthorizationStatusAuthorizedAlways.

Vous pouvez vérifier l'état en utilisant:

 CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 

Et peut-être

 if (status != kCLAuthorizationStatusAuthorizedAlways) 

Vous pouvez à nouveau requestr des permissions.