IOS 8 CLLocationManager问题(授权不工作)

#import "MyLocationViewController.h" #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); @interface MyLocationViewController () @end @implementation MyLocationViewController { CLLocationManager *locationManager; } - (void)requestAlwaysAuthorization { [locationManager requestAlwaysAuthorization]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.mapView.showsUserLocation = YES; self.mapView.delegate = self; locationManager = [[CLLocationManager alloc] init]; } - (IBAction)unwindToMap:(UIStoryboardSegue *)segue { } - (IBAction)getCurrentLocation:(id)sender { locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest; [locationManager startUpdatingLocation]; } - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { MKCoordinateRegion mapRegion; mapRegion.center = mapView.userLocation.coordinate; mapRegion.span.latitudeDelta = 0.001; mapRegion.span.longitudeDelta = 0.001; CLLocationCoordinate2D location = userLocation.coordinate; float lat = location.latitude; float lng = location.longitude; NSDictionary *locationDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithFloat:lat] , @"Latitude", [NSNumber numberWithFloat:lng], @"Longitude", nil]; NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: locationDictionary, @"Location_A", nil]; NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; NSString *str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); if (mapView.userLocation != nil) { _longitudeLabel.text = [NSString stringWithFormat:@"%.8f", mapView.userLocation.coordinate.longitude]; _latitudeLabel.text = [NSString stringWithFormat:@"%.8f", mapView.userLocation.coordinate.latitude]; } [mapView setRegion:mapRegion animated: YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

这是我的代码。

现在,我知道我需要用NSLocationAlwaysUsageDescription键编辑我的info.plist文件(我这样做了),并且为描述添加了一个string。

但是,我在执行授权部分时遇到问题,因为错误仍然是这样写的:

 Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first. 

我已经阅读了CLLocationManager的Apple IOS 8文档,但不知何故,我的代码将无法正常工作。

有人可以帮助我,以便通过查看我的代码中我需要修改,以便它的工作,以上的错误信息消失吗?

谢谢!

在用户授权您的应用程序使用位置服务之前,您不应该打开MKMapViewshowsUserLocation

您可以实现CLLocationManagerDelegatelocationManager:didChangeAuthorizationStatus:方法,并打开showsUserLocation

 - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) { self.mapView.showsUserLocation = YES; } }