CoreLocation
一次定位
一次定位一般用于非地图应用,比如饿了么,51offer等APP只需要知道目前的位置即可。
1.导入CoreLocation.framework
2.代码
常理,导入头文件#import
添加一个属性@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;