今天总结下iOS开发中定位权限那些坑。顺便吐槽下我们的产品经理。
这里不讲定位功能怎么实现,反正这些东西一搜一堆,懒得搜我这里贴上一个很全的实现文章:iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)包括这位简书作者其他定位相关文章,都很详细。
接下来进入重点,我们都知道iOS定位权限自从iOS8之后就改动很多,出于对用户隐私方面来说,如果要调用GPS模块,就必须经过用户确定,体现在应用弹窗让用户选择。所以你要在info.plist里面加两个字段:NSLocationWhenInUseUsageDescription (使用应用期间)或NSLocationAlwaysUsageDescription(始终),以申请定位权限。
那么当我们允许应用使用GPS获取位置信息之后,我们在设置-隐私-定位服务 找到自己的应用点进去可以看到如下
有三个选项:1、永不 2、使用应用期间 3、始终。
当然,有的情况下只有两个选择:(1、永不 2、使用应用期间)(info.plist只设置了NSLocationWhenInUseUsageDescription) 或者(1、永不 2、始终)(info.plist只设置了NSLocationAlwaysUsageDescription) 。
顾名思义永不对应着不给定位权限,使用期间就是应用在前台运行状态,始终就包括应用在后台也能获取定位信息。
有些应用需求需要应用一直获取定位信息,比如骑车、跑步、导航这一类应用,如果要实现后台定位,同时必须打开这个设置才能在后台获取位置信息。
这里要重点是说明一点,开启了后台定位的情况下,如果定位权限是处于使用应用期间的话,应用进入后台,桌面顶部位置会出现蓝色提醒条,提醒你什么应用在使用定位。
思路到这里,感觉好像前面扯多了,还是直接进入我们的产品需求重点。
我们产品是运动类,骑车记录轨迹的。一直以后都是在后台定位,两个权限都有添加上,定位权限默认是勾选始终。当然在桌面上不会出现定位蓝条。本来挺好的,出现蓝条占位置还更让人反感,网上都是一堆在询问如何不显示蓝条的,我们产品倒好,这一版需要出现蓝条,说是我们应用在后台定位没有什么提示,有时候用户骑车定位,然后忘了结束骑行缺不知道,倒是定位轨迹路线很乱。从这一点出发倒是可取。于是想要默认勾选使用应用期间。
产品说什么事什么,赶紧改。由于我们用的是高德地图跟高德定位,高德定位的API只有
让我死活搞了半天,到处找资料,还是没搞定定位权限默认选择使用应用期间,但是看到有个应用可以,那一定可以。
最后看到一些关于定位权限的描述是这样的:
requestWhenInUseAuthorization跟requestAlwaysAuthorization的执行顺序有影响,requestAlwaysAuthorization的权限大于(包括)requestWhenInUseAuthorization,于是我应该是执行顺序问题,应该先执行requestWhenInUseAuthorization在执行requestAlwaysAuthorization。果然在demo里面搞定了。
但是在项目迟疑了下,因为用的是高德定位,它.h没有提供CLLocationManager属性。。。
于是想着是不是先自己创建一个官方的CLLocationManager获取权限:
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];
self.locationManager.distanceFilter = 500;
self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
self.locationManager.allowsBackgroundLocationUpdates = YES;
[self.locationManager requestLocation];
}
else {
[self.locationManager startUpdatingLocation];
}
果然可以了,这下应用安装获取权限默认选中的就是使用应用期间,也相应的开启定位之后,在后台的时候,桌面上有蓝条提醒。