This is my code, showing both the alert and the blue dot for the current position on the map:
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;
}
I've added the key NSLocationWhenIsUseUsageDescription
as a string to the Info.plist.
I'm still getting the same error on Xcode.
It is due to both:
and
You need to check if the user has given permission before you call these. Also make sure you turn off User Location in the MKMapKit on the storyboard (this one took me days to track down).
Do something like:
Depending on your app you may not want to ask for the user's permission on launch since that is not recommended.
This way is working without errors on Xcode6:
AppDelegate.h
AppDelegate.m
The alert message shows when you open the app for the first time
On swift :
Don't forget to add into Info.plist file these keys:
The keyword in the info file is ("In" instead of "Is"):
The error message is pretty literal. Don't call
[self.locationManager startUpdatingLocation]
until you have authorization. Your[self.locationManager requestWhenInUseAuthorization]
, per the docs, is asynchronous.This means you are both prompting for access as well as starting your scan at the same time.
Instead, try implementing
-[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:]
and starting your scan there after it's been determined that you have authorization.Based off of Jerome's response, I translated the answer that worked for me to Swift.
Note: From what I read in the documents, there is no
kCLAuthorizationStatusAuthorized
equivalent in Swift.