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)); |
这个属性仅针对申请Always权限的情况,申请WhenInUse权限的不受该属性的影响
这个属性表示,当请求了Always权限,并且在后台定位的时候蓝条是否会出现,默认值为NO,也就是说默认情况下,蓝条的出现时机与iOS10的保持了一致
当设置为YES后,请求了Always权限并且在后台定位的时候会出现蓝条
参考链接:https://forums.developer.apple.com/thread/84125
(Ps: 设置成YES,让自己的app在后台悄悄定位的时候还出个蓝条?估计没谁这么干。。。Apple这是妥协了么。。。)
————以上为9月18日更新————
iOS11下定位权限变更
依旧支持两种定位权限没有改变:AlwaysAuthorization 和 WhenInUseAuthorization .
iOS10以及之前版本系统打包发布的请求Always权限的app,在系统升级到iOS11之后,请求框自动增加 WhenInUse 选项供用户选择(如图右侧弹框所示)
iOS11之后申请定位权限,必须在Info.plist中必须包含 NSLocationWhenInUseUsageDescription 字段,否则既无法请求 Always 权限,也无法请求 WhenInUse 权限。
iOS11之后,Info.plist中的 NSLocationAlwaysUsageDescription 字段被废弃,替代的是 NSLocationAlwaysAndWhenInUseUsageDescription 字段,申请 Always 必须填写该字段。同时请求 Always 权限的时候,弹框将不再是之前的样式,而是同时包含 WhenInUse 和 Always 选项的新弹框(如图左侧下部和右侧弹框所示)。
定位权限的请求流程如下图所示:
- 如果第一次请求的是 WhenInUse 权限,之后可以再次请求 Always 权限(如图左侧流程)。
如果第一次直接请求 Always 权限,即使用户选择的是 WhenInUse 权限,之后也不可以再次请求 Always 权限(如图右侧流程)
iOS11之后,在后台定位的时候,都会有蓝条的出现,无法消除蓝条的存在。
iOS11详细权限列表
iOS 11
- | - | Capabilities 关 | Capabilities 开 |
---|---|---|---|
requestAlwaysAuthorization | allowsBackgroundLocationUpdates关 | 有前台、无后台、无蓝条 | 有前台、无后台、无蓝条 |
allowsBackgroundLocationUpdates开 | iOS抛出Crash | 有前台、有后台、有蓝条 | |
requestWhenInUseAuthorization | allowsBackgroundLocationUpdates关 | 有前台、无后台、无蓝条 | 有前台、无后台、无蓝条 |
allowsBackgroundLocationUpdates开 | iOS抛出Crash | 有前台、有后台、有蓝条 | |
无/用户拒绝 | allowsBackgroundLocationUpdates关 | 无任何定位 | 无任何定位 |
allowsBackgroundLocationUpdates开 | iOS抛出Crash | 无任何定位 |
参考文档
- WWDC 2017 Session 713