题记:本人之前做过定位和地图,由于公司长时间没有此方面的业务,最近有人询问相关的知识,竟然一点不记得。特写此笔记,方便朋友和自己随时查看。
苹果的定位分为iOS8.0-(8.0之前)和iOS8.0+(8.0之后)
iOS8.0之前的,楼主不在赘述,有需要的朋友,联系楼主。
创建步骤如下:
1.创建好工程,导入定位的头文件
#import <CoreLocation/CoreLocation.h>
2.创建 定位管理者对象 CLLocationManager
/** 定位对象 */
@property(nonatomic,strong) CLLocationManager * locationManager;
3.初始化 定位管理者 locationManager
,并判断是否开启了定位服务
//定位管理器
_locationManager=[[CLLocationManager alloc]init];
// 判断定位服务是否开启
if (![CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务当前可能尚未打开,请设置打开!");
return;
}
一般locationServicesEnabled
定位服务是打开的,因为手机上其他app会调用定位服务
4.查看用户是否授权定位服务
/**
* authorizationStatus:返回当前授权调用应用程序的状态
* kCLAuthorizationStatusNotDetermined:用户还没有关于这个应用程序做出了选择
*/
if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){
[_locationManager requestAlwaysAuthorization];
}else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){
//设置代理
self.locationManager.delegate=self;
//设置定位精度
_locationManager.desiredAccuracy=kCLLocationAccuracyBest;
//定位频率,每隔多少米定位一次
CLLocationDistance distance=10.0;//十米定位一次
_locationManager.distanceFilter=distance;
//启动跟踪定位
[_locationManager startUpdatingLocation];
}
4.1用户定位的授权状态是kCLAuthorizationStatusNotDetermined
,即用户还没有关于应用程序做出选择,则需要重新请求权限
授权有两种方式
// 前后台定位授权
[_locationManager requestAlwaysAuthorization];
// 前台定位授权
[_locationManager requestWhenInUseAuthorization];
两种授权都需要在info.plist文件里面设置
--requestAlwaysAuthorization
设置
注意:
iOS11之前持续定位在info.plist文件中添加的是Privacy - Location Always Usage Description,并且iOS11中在询问用户定位权限时,使用requestAlwaysAuthorization属性,用户点击的是“app使用期间使用”,则系统会选择成 使用期间使用定位功能

--requestWhenInUseAuthorization
设置

前台定位,退到后台不定位,要是想使用后台定位需要设置
5.设置代理并遵守协议
@interface ViewController ()<CLLocationManagerDelegate>
self.locationManager.delegate=self;
6.实现代理方法
#pragma mark - CoreLocation 代理
#pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定位到相应位置)
//可以通过模拟器设置一个虚拟位置,否则在模拟器中无法调用此方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location=[locations firstObject];//取出第一个位置
CLLocationCoordinate2D coordinate=location.coordinate;//位置坐标
NSLog(@"经度:%f,纬度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);
//如果不需要实时定位,使用完即使关闭定位服务
[_locationManager stopUpdatingLocation];
}
注意:
如果app需要后台定位则必须添加一句代码
// 后台定位功能
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
self.locationManager.allowsBackgroundLocationUpdates = YES;
}
如果选择的是[_locationManager requestWhenInUseAuthorization];
(允许前台定位),则还需要打开一个设置 Location updates属性

个人疑惑:self.locationManager.allowsBackgroundLocationUpdates = YES;
官方给的解释是不针对iOS9.0或者更高版本,但是不添加这句话,不能实现后台定位,有大神知道,麻烦大神给留言说一声,感激不尽。

网友评论