一次定位及设置前台授权和后台定位
1. 首先导入头文件 #import <CoreLocation/CoreLocation.h>
2. 添加位置管理者属性 @property(nonatomic,strong)CLLocationManager*mgr;
3. 创建定位管理者 统一管理定位服务 _mgr= [[CLLocationManageralloc]init];
4. 请求授权 (三种方法: 第一种是前台授权 第二种是前后台同时授权但是用户反感
第三种是设置前台定位及设置代码和info.plist设置后台定位)
4.1 仅限于在前台使用时授权
1) 配置info.plist相关key (NSLocationWhenInUseUsageDescription)
2)做好低版本适配
if([_mgrrespondsToSelector:@selector(requestWhenInUseAuthorization)]){
//当应用在使用时可以使用定位服务(仅限于应用在前台使用时授权,一旦程 序到后台就停止定位)
[_mgrrequestWhenInUseAuthorization];
}
4.2 应用始终使用定位服务(应用在前台和后台都能获取到定位服务)——这种方式用户反感
1)配置info.plist相关key(NSLocationAlwaysUsageDescription)
2)做好低版本适配
if([_mgrrespondsToSelector:@selector(requestWhenInUseAuthorization)]){
1.2.2应用始终使用定位服务(应用在前台和后台都能获取到定位服务) //用户反感
//反感是因为授权提示是 :@"应用未打开时,允许定位"
[_mgrrequestAlwaysAuthorization];
}
4.3 应用开启临时后台(设置后台运行模式) (常用模式)
1) 配置info.plist相关key ( 这里需要新加一个选项 选择: Required background modes->打开items->选取App registers for location updates(定位后台运行的模式)) — 在ios8 之前只要设置这个就行了
2) 在ios8以后就是ios9的一个新特性需要再加上一句代码 才能执行这个功能
IOS9新特性要求代码允许mgr执行后台运行模式
_mgr.allowsBackgroundLocationUpdates=YES;//这是获取后台定位 前台授权还需要再设置 要是不要后台定位 这个就不要设置
注意 : 这个时候 用户反感的那个就要取消掉不用,但是前台的授权模式还是要打开
5. 设置代理 同时遵守协议
1.3获取数据设置代理 <遵守协议 :CLLocationManagerDelegate>
_mgr.delegate=self;
6. 开启定位 [_mgrstartUpdatingLocation];
7. 实现CLLocationManagerDelegate 代理方法
当更新位置时调用 底层是异步操作定位
-(void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray *)locations{
CLLocation : 位置对象包含了位置信息这个里面有很多其他的属性可以设置 点击头文件查看即可
CLLocation*location = locations.lastObject;
NSLog(@"%f,%f",location.coordinate.latitude,location.coordinate.longitude);
停止定位
[_mgr stopUpdatingLocation];
}
写到这里 基本的 定位(后台前台)都讲完了 还有其他的设置优化持续定位 如下:
优化持续定位 : (经纬度不变的情况下 就不用一直不断的去请求)
1. 距离筛选器 减少不必要的回调
_mgr.distanceFilter = 10;
2 设置期望精确度 减少耗电量(减少能耗)
_mgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;//这个还有很多枚举值可以根据自己需要的进行选取
谢谢! ! 希望能帮到大家