KittenYang

iOS8中定位服务CLLocationManager使用的一些改变

今天我在我的第三放微博客户端 KittenYang 中使用定位服务发现,由于使用Xcode6进行编译,在iOS8中之前老一套的 CLLocationManager 使用规则已经不适用了。好在经过搜索和询问我终于找到了iOS8下的解决办法,下面做个笔录。

首先在 .h文件 中定义一个属性:

@property (nonatomic, strong) CLLocationManager *locationManager;

并且遵守CLLocationManagerDelegate委托:

@interface NearbyViewController: BaseViewController<CLLocationManagerDelegate>

之后在 viewDidLoad 中创建这个变量:

if (self.locationManager == nil) {  
        self.locationManager = [[CLLocationManager alloc]init];
    }

    self.locationManager.delegate = self;
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 8.0) {
        [self.locationManager requestWhenInUseAuthorization];
    }

    [self.locationManager startUpdatingLocation];

注意到上面的[self.locationManager requestWhenInUseAuthorization]; 这么做就是为了实现第一次打开应用询问用户是否允许该应用使用定位服务。

之后,请到info.plist中添加一个Key:NSLocationWhenInUseUsageDescription,就像这样:

注意后面的文字:"请打开定位,本服务才能帮你找到最近的站点。"这时显示在如下两张图中的文字:

当然,这里的文字你可以随意写。

这还没完哦,别忘了我们实现了CLLocationManagerDelegate委托,所以要实现对应协议方法:

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations{
    CLLocation *newLocation = [locations lastObject];
    NSLog(@"开始定位:%@",newLocation);
    [manager stopUpdatingHeading];
    if (self.data == nil) {
        float longitude = newLocation.coordinate.longitude;
        float latitude =  newLocation.coordinate.latitude;


- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error{
    NSLog(@"定位错误");
}

Tips:

这里要特别注意,之前的

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation __OSX_AVAILABLE_BUT_DEPRECATED

已经不能在iOS8上使用了!

好了,在真机或者模拟器运行吧 :)


转载请注明出处,万分感谢!

KittenYang

写写代码,做做设计,看看产品。