web-dev-qa-db-fra.com

didUpdateLocations non appelé

J'essaie d'obtenir mon emplacement actuel, mais le point d'arrêt dans didUpdateLocations n'est jamais appelé.

LocationManager:

locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDesiredAccuracy:kCLDistanceFilterNone];
[locationManager startUpdatingLocation];

Méthode déléguée:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

J'ai confirmé que les services de localisation et activé et autorisé.

Pourquoi la méthode déléguée locationManager n'est-elle pas appelée comme elle le devrait?

Merci, Mike

31
user2247438

De plus, dans iOS8, vous devez avoir deux choses supplémentaires:

  • Ajoutez une clé à votre Info.plist et demander l'autorisation au gestionnaire de site lui demandant de démarrer.

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • Vous devez demander une autorisation pour la méthode de localisation correspondante.

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

Exemple de code:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

Source: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

68
MarMass

Quand j'ai eu ce problème, c'était à cause d'un problème de thread.

Assurez-vous que toutes ces méthodes sont appelées sur le thread principal. Il est très important que non seulement la méthode startUpdatingLocation soit appelée sur le thread principal, mais aussi les autres.

Vous pouvez forcer l'exécution de code sur le thread principal en l'enveloppant à l'intérieur

dispatch_sync(dispatch_get_main_queue(), ^{

});

Consultez également cette réponse .

30
Tim Bodeit

Assurez-vous d'avoir ajouté CLLocationManager en tant que propriété.

@property (nonatomic , strong) CLLocationManager *locationManager;
9
Gabriel.Massana

Oui, la propriété était la solution pour moi, et bonne idée de vérifier que le service de localisation est activé:

if ([CLLocationManager locationServicesEnabled]) {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}
6
Zoltan Vinkler

Vous devez indiquer au simulateur quel emplacement simuler. Si vous ne spécifiez pas d'emplacement, vos méthodes déléguées CLLocationManager ne seront jamais appelées. Vous pouvez utiliser le menu du simulateur Déboguer -> Emplacement. Également dans Xcode vers le bas par la zone de débogage, il y a une petite flèche de localisation qui apparaît lors de l'exécution de l'application à partir de Xcode. Vous pouvez l'utiliser pour spécifier un fichier GPX pour simuler le mouvement (ce n'est toujours pas le même que le vrai appareil).

https://devforums.Apple.com/message/1073267#1073267

2
dreday

Veuillez noter que dans iOS 11 et versions ultérieures, une troisième clé doit être fournie à votre info.plist: NSLocationAlwaysAndWhenInUseUsageDescription

2
Urvish Modi

Si CLLocationManagerDelegate est défini, MapView Delegate l'est également

Vérifiez également l'emplacement du simulateur, cliquez sur Simulateur> Débogage> Emplacement, s'il n'y en a pas, changez-le en ville ou en autoroute. Cela a fonctionné pour moi.

1
Satyam Tayal