iOS CoreLocation 的使用

来源:互联网 时间:2017-01-22


CoreLocation
一次定位

一次定位一般用于非地图应用,比如饿了么,51offer等APP只需要知道目前的位置即可。

1.导入CoreLocation.framework



2.代码

常理,导入头文件#import<CoreLocation/CoreLocation.h>并添加代理<CLLocationManagerDelegate>

添加一个属性@property (nonatomic,strong) CLLocationManager *locationManager//基本功能都在CLLocationManager类里面

初始化 self.locationManager = [CLLocationManager new]; self.locationManager.delegate = self;

在iOS8.0之后必须要调用的两种方法之一:requestWhenInUseAuthorization(授权用于一次定位)和requestAlwaysAuthorization(授权用于多次定位)并配置plist文件



这个配置不用死记,百度即可。右面的是说明(根据想要提示的信息写),在授权的时候显示



之后调用开始定位方法 startUpdatingLocation

这里所有代码为:

self.locationManager = [CLLocationManager new];

self.locationManager.delegate = self;

[self.locationManager requestWhenInUseAuthorization];

// [self.locationManager requestAlwaysAuthorization];//二者选一

[self.locationManager startUpdatingLocation];

接下来调用代理方法 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray*)locations;

可打印当前位置信息在此类中:

CLLocation *location = locations[0];

NSLog(@"latitude = %f,longitude = %f",location.coordinate.latitude,location.coordinate.longitude);



这样写会不断调用位置信息,这里根据需要,在此类中加入进行停止更新位置信息的方法:

[self.locationManager stopUpdatingLocation]//这样不会重复更新,但是还是会出现2or3此位置更新QAQ

补充:

1.requestWhenInUseAuthorization&requestAlwaysAuthorization是iOS8.0之后才有的,因此完整的代码应该有判断设备版本:

a.直接判断设备版本

if([UIDevice currentDevice].systemVersion.floatValue >= 8.0){

[self.locationManager requestWhenInUseAuthorization];

// [self.locationManager requestAlwaysAuthorization];

}

b.判断能不能执行iOS8.0之后的方法

if([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){

[self.locationManager requestWhenInUseAuthorization];

// [self.locationManager requestAlwaysAuthorization];

}

2.一次定位在8.0版本后也可在后台持续更新,其方法为:

self.locationManager.allowsBackgroundLocationUpdates = YES;

这样即使回到home,也会更新,只不过屏幕上方会有蓝色提示:



3.iOS8之后,requestWhenInUseAuthorization&requestAlwaysAuthorization也可在setting里选择 privacy ->location services -> 选择APP进行具体选择




多次定位

主要应用于需要时时定位的APP,比如百度地图,高德地图,时时跟踪等APP。基本代码一次定位差不多,但也有些不同。

基本改动为[self.locationManager requestAlwaysAuthorization];

把代理方法中的stopUpdatingLocation删掉

这样就能持续不断的更新当前位置信息。但是这样有个致命的缺点对于手机来说,就是耗电问题!能从软件方向解决就不要省代码。下面就来介绍省电模式代码:

1.位置筛选器 --> 当位置发生一定的改变之后再调用代理方法 --> 降低代理方法的调用,省电

[self.locationManager setDistanceFilter:10];

2.设置精准度--> 降低通讯之间的计算, 达到省电的目的

self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;

这里的值可以根据不同的需求来赋值:

extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);

extern const CLLocationAccuracy kCLLocationAccuracyBest;

extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;

extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;

extern const CLLocationAccuracy kCLLocationAccuracyKilometer;

extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;




相关阅读:
Top