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
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/
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 .
Assurez-vous d'avoir ajouté CLLocationManager en tant que propriété.
@property (nonatomic , strong) CLLocationManager *locationManager;
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];
}
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).
Veuillez noter que dans iOS 11 et versions ultérieures, une troisième clé doit être fournie à votre info.plist: NSLocationAlwaysAndWhenInUseUsageDescription
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.