最近一直被问到iOS定位权限相关的各种问题,整理下iOS定位权限涉及到的相关字段,其中iOS10与iOS9基本一致。
iOS定位权限相关字段
iOS系统下控制定位权限的字段主要有以下几处:
- Capabilities 中选项:
- BackgroundModes 中的 LocationUpdates :是否开启后台定位能力,关闭此项后,无论其他几项如何设置,都将没有后台定位权限。
- Info.plist 中的字段:
- NSLocationUsageDescription iOS7和之前的系统在弹框的时候会使用的描述,为可选项。
- NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription iOS8-10的弹框描述字段,申请 requestAlwaysAuthorization 或 requestWhenInUseAuthorization 时必须填写对应的字段。
- CoreLocation.framework 中的设置选项:
- requestAlwaysAuthorization 和 requestWhenInUseAuthorization 与Info.plist中的描述字段对应,申请不同的定位权限。
- pausesLocationUpdatesAutomatically 是否允许系统自动暂停定位功能,设置为YES进行后台定位时,系统检测到长时间没有位置更新的时候,将会暂停定位功能,当app进入前台时会恢复定位功能。(Apple的官方文档描述很模糊,可以参考Stack Overflow讨论)
- allowsBackgroundLocationUpdates 是否允进行后台定位
Info.plist 中的字段
iOS版本 | NSLocationUsageDescription | NSLocationWhenInUseUsageDescription | NSLocationAlwaysUsageDescription |
---|---|---|---|
iOS 7 | YES | × | × |
iOS 8 | × | YES | YES |
iOS 9 | × | YES | YES |
iOS 10 | × | YES | YES |
定位权限相关字段
iOS版本 | Capabilities | pauses Location Updates Automatically | request Always/WhenInUse Authorization | allows Background Location Updates | BlueBar |
---|---|---|---|---|---|
iOS 7 | YES | YES | × | × | × |
iOS 8 | YES | YES | YES | × | YES |
iOS 9 | YES | YES | YES | YES | YES |
iOS 10 | YES | YES | YES | YES | YES |
不同iOS版本差异
以下表格列举下不同的iOS版本下,不同设置的结果:
(其中pausesLocationUpdatesAutomatically选项在iOS7-10版本下效果一致,不再列举出来。)
iOS 7
- | Capabilities 关 | Capabilities 开 |
---|---|---|
startUpdatingLocation | 有前台、无后台、无蓝条 | 有前台、有后台、无蓝条 |
用户拒绝 | 无任何定位 | 无任何定位 |
iOS 8
- | Capabilities 关 | Capabilities 开 |
---|---|---|
requestAlwaysAuthorization | 有前台、无后台、无蓝条 | 有前台、有后台、无蓝条 |
requestWhenInUseAuthorization | 有前台、无后台、无蓝条 | 有前台、有后台、有蓝条 |
无/用户拒绝 | 无任何定位 | 无任何定位 |
iOS 9 & iOS 10
- | - | Capabilities 关 | Capabilities 开 |
---|---|---|---|
requestAlwaysAuthorization | allowsBackgroundLocationUpdates关 | 有前台、无后台、无蓝条 | 有前台、无后台、无蓝条 |
allowsBackgroundLocationUpdates开 | iOS抛出Crash | 有前台、有后台、无蓝条 | |
requestWhenInUseAuthorization | allowsBackgroundLocationUpdates关 | 有前台、无后台、无蓝条 | 有前台、无后台、无蓝条 |
allowsBackgroundLocationUpdates开 | iOS抛出Crash | 有前台、有后台、有蓝条 | |
无/用户拒绝 | allowsBackgroundLocationUpdates关 | 无任何定位 | 无任何定位 |
allowsBackgroundLocationUpdates开 | iOS抛出Crash | 无任何定位 |
关于继续使用后台定位功能的提示弹框
- 如果申请的定位权限为requestAlwaysAuthorization,那应用在切到后台一定时长间隔后,会弹出提示框询问用户“是否继续允许使用后台定位”。
- 如果申请的定位权限为requestWhenInUseAuthorization,则不会有提示弹框。
关于 pausesLocationUpdatesAutomatically 属性
CLLocationManager.pausesLocationUpdatesAutomatically 设置是否允许自动暂停定位服务,目前Apple的官方文档描述的很模糊,导致Stackoverflow上有很多的讨论:
- 该选项主要用来节省电量消耗,防止app在进入后台后没有及时停止定位消耗电量,设置为YES后,当iOS判定设备不太可能发生移动的时候(这句话是Apple文档直译,然而并不知道具体怎么判定),会自动暂停掉定位服务以及相关硬件设备
- app在后台定位时,一旦符合了Apple的判定,定位服务以及相关硬件设备被暂停了,除非app回到前台,否则不会恢复定位服务(硬件暂停使得iOS无法判定设备移动)