iOS定位权限详细说明

最近一直被问到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无法判定设备移动)

参考文档