CoreLocation框架
CLLocationManager对象
CLLocationManager: 位置管理者,负责对定位进行相关设置
导入头文件
distanceFilter: 设置定位距离过滤参数- 以(米)为单位
- 当上次定位和本次定位之间的距离 >= 此值时,才会调用代理通知开发者
desiredAccuracy: 设置定位精度,是个枚举类型
- 精确度越高,越耗电,所以需要我们根据实际情况,设定对应的精度
/** desiredAccuracy */ // 最适合导航 kCLLocationAccuracyBestForNavigation // 最好的 kCLLocationAccuracyBest; // 10m kCLLocationAccuracyNearestTenMeters; // 100m kCLLocationAccuracyHundredMeters; // 1000m kCLLocationAccuracyKilometer; // 3000m 适用定位城市 kCLLocationAccuracyThreeKilometers;
- 精确度越高,越耗电,所以需要我们根据实际情况,设定对应的精度
开始更新用户位置
- (void)startUpdatingLocation;
- 当调用了startUpdatingLocation方法后,就开始不断地请求、刷新用户的位置,一旦请求到用户位置就会调用代理的下面方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
- 当调用了startUpdatingLocation方法后,就开始不断地请求、刷新用户的位置,一旦请求到用户位置就会调用代理的下面方法
停止更新用户位置
- (void) stopUpdatingLocation;
- CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
+ (BOOL)locationServicesEnabled;
iOS各个版本适配
iOS8之前版本
从
iOS 6开始
,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权要想获得用户的
位置、通讯录、日历、相机、相册等等
当想访问用户的隐私信息时,系统会
自动弹出
一个对话框让用户授权
iOS8版本
从
iOS 8.0
开始,苹果进一步加强了对用户隐私的保护。当APP想访问用户的隐私信息时,系统
不再自动弹出
一个对话框让用户授权
解决方案:
调用iOS 8.0的API,主动请求用户授权
/* 请求允许在前后台都能获取用户位置的授权 /
- (void)requestAlwaysAuthorization
/* 请求允许在前台获取用户位置的授权 /
- (void)requestWhenInUseAuthorization
务必在
info.plist文件
中配置对应的键值, 否则以上请求授权的方法不生效
NSLocationAlwaysUsageDescription
: 允许在前后台获取GPS的描述
NSLocationWhenInUseDescription
: 允许在前台获取GPS的描述iOS9版本
iOS 9.0 如果当前处于前台授权状态,默认是不可以后台获取用户位置。但可以设置以下属性为YES,就可以继续获取后台位置,但是会出现蓝条
使用注意:必须设置对应的后台模式:location updates
- BOOL allowsBackgroundLocationUpdates
iOS 9.0 可以单次请求用户位置
//请求用户位置
- (void)requestLocation
// 成功调用
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
// 失败调用
-(void)loc