iOS11定位权限变更(WWDC2017-Session713)

iOS11中针对定位权限又有新的细化控制,看了下WWDC2017的Session713中关于定位权限的部分,balabala说了一大堆,总结出来也就几条。。。

iOS11 GM版本又有变更

测试GM版本的时候,发现后台定位的时候蓝条竟然没有出现!什么鬼。。。Google了一下发现iOS11在蓝条的出现上确实有修改:

从iOS11-beta-5开始,iOS11中CLLocationManager类增加了一个字段:

1
@property(assign, nonatomic) BOOL showsBackgroundLocationIndicator  API_AVAILABLE(ios(11.0));
  1. 这个属性仅针对申请Always权限的情况,申请WhenInUse权限的不受该属性的影响

  2. 这个属性表示,当请求了Always权限,并且在后台定位的时候蓝条是否会出现,默认值为NO,也就是说默认情况下,蓝条的出现时机与iOS10的保持了一致

  3. 当设置为YES后,请求了Always权限并且在后台定位的时候会出现蓝条

参考链接:https://forums.developer.apple.com/thread/84125

(Ps: 设置成YES,让自己的app在后台悄悄定位的时候还出个蓝条?估计没谁这么干。。。Apple这是妥协了么。。。)

————以上为9月18日更新————

iOS11下定位权限变更

  1. 依旧支持两种定位权限没有改变:AlwaysAuthorization 和 WhenInUseAuthorization .

  2. iOS10以及之前版本系统打包发布的请求Always权限的app,在系统升级到iOS11之后,请求框自动增加 WhenInUse 选项供用户选择(如图右侧弹框所示)

  3. iOS11之后申请定位权限,必须在Info.plist中必须包含 NSLocationWhenInUseUsageDescription 字段,否则既无法请求 Always 权限,也无法请求 WhenInUse 权限。

  4. iOS11之后,Info.plist中的 NSLocationAlwaysUsageDescription 字段被废弃,替代的是 NSLocationAlwaysAndWhenInUseUsageDescription 字段,申请 Always 必须填写该字段。同时请求 Always 权限的时候,弹框将不再是之前的样式,而是同时包含 WhenInUse 和 Always 选项的新弹框(如图左侧下部和右侧弹框所示)。

  5. 定位权限的请求流程如下图所示:

    • 如果第一次请求的是 WhenInUse 权限,之后可以再次请求 Always 权限(如图左侧流程)。
    • 如果第一次直接请求 Always 权限,即使用户选择的是 WhenInUse 权限,之后也不可以再次请求 Always 权限(如图右侧流程)

      authorization

  6. iOS11之后,在后台定位的时候,都会有蓝条的出现,无法消除蓝条的存在。

iOS11详细权限列表

iOS 11

- - Capabilities 关 Capabilities 开
requestAlwaysAuthorization allowsBackgroundLocationUpdates关 有前台、无后台、无蓝条 有前台、无后台、无蓝条
allowsBackgroundLocationUpdates开 iOS抛出Crash 有前台、有后台、有蓝条
requestWhenInUseAuthorization allowsBackgroundLocationUpdates关 有前台、无后台、无蓝条 有前台、无后台、无蓝条
allowsBackgroundLocationUpdates开 iOS抛出Crash 有前台、有后台、有蓝条
无/用户拒绝 allowsBackgroundLocationUpdates关 无任何定位 无任何定位
allowsBackgroundLocationUpdates开 iOS抛出Crash 无任何定位

参考文档