Voici mon code, affichant à la fois l'alerte et le point bleu de la position actuelle sur la carte:
MapName.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface MapName : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>
@property (strong, nonatomic) IBOutlet MKMapView *MapName;
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
MapName.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
//Center the map
[self gotoLocation];
//Show current position
_MapName.showsUserLocation = YES;
}
J'ai ajouté la clé NSLocationWhenIsUseUsageDescription
sous forme de chaîne à Info.plist . Je reçois toujours la même erreur sur Xcode.
C'est dû à la fois:
[self.locationManager startUpdatingLocation];
et
_MapName.showsUserLocation = YES;
Vous devez vérifier si l'utilisateur a donné l'autorisation avant de les appeler. Assurez-vous également de désactiver l'emplacement de l'utilisateur dans le MKMapKit sur le storyboard (celui-ci m'a pris plusieurs jours).
Faites quelque chose comme:
CLAuthorizationStatus authorizationStatus= [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusAuthorized ||
authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {
[self.locationManager startUpdatingLocation];
_MapName.showsUserLocation = YES;
}
En fonction de votre application, vous pouvez ne pas souhaiter demander l'autorisation de l'utilisateur au lancement, car cela n'est pas recommandé.
Le message d'erreur est plutôt littéral. N'appelez pas [self.locationManager startUpdatingLocation]
tant que vous n'avez pas l'autorisation. Votre [self.locationManager requestWhenInUseAuthorization]
, selon la documentation, est asynchrone.
Lorsque le statut d'autorisation actuel est
kCLAuthorizationStatusNotDetermined
, cette méthode s'exécute de manière asynchrone et invite l'utilisateur à accorder l'autorisation à l'application d'utiliser les services de localisation.
Cela signifie que vous demandez à la fois un accès et que vous démarrez votre analyse en même temps.
Au lieu de cela, essayez d’implémenter -[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:]
et de lancer votre analyse à partir du moment où il aura été déterminé que vous disposez d’une autorisation.
Sur Swift:
let locationManager: CLLocationManager = CLLocationManager()
let authorizationStatus = CLLocationManager.authorizationStatus()
override func viewDidLoad() {
super.viewDidLoad()
if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
locationManager.startUpdatingLocation()
}
else
{
locationManager.requestWhenInUseAuthorization()
}
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
}
N'oubliez pas d'ajouter dans le fichier Info.plist ces clés:
Le mot clé dans le fichier d'information est ("In" au lieu de "Is"):
NSLocationWhenInUseUsageDescription
Sur la base de la réponse de Jérôme, j'ai traduit la réponse qui fonctionnait pour moi en Swift.
let authorizationStatus = CLLocationManager.authorizationStatus()
if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
self.findMyLocation()
}
Remarque: d'après ce que j'ai lu dans les documents, il n'y a pas d'équivalent kCLAuthorizationStatusAuthorized
dans Swift.
Cette façon fonctionne sans erreurs sur Xcode6:
AppDelegate.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize locationManager = _locationManager;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Current position
self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager requestWhenInUseAuthorization];
return YES;
}
@end
Le message d'alerte s'affiche lorsque vous ouvrez l'application pour la première fois.