A07dab5460465e3caf0a266920d73252
What's New in Core Location:新增定位临时授权

在今年的 WWDC 中,iOS 13的其中一个主题就是隐私,session 705 是其中之一,该 session 主要介绍了 Core Location 的一些新变化。

我们都知道,在需要获取用户位置时,会先弹出提示框获得权限,再根据 API 去获取所在位置。但在 iOS 13 中,提示框内容与以往不同。

始终允许被推迟

先创建CLLocationManager 请求定位权限。

var locationManager = CLLocationManager()

locationManager.requestWhenInUseAuthorization()
 // -- OR requesrequestAlwaysAuthorization() --

在用户授权之后,若其他事件进入,比如接电话或者回复短信,应用就会退到后台,那么系统将会展示一个提示框给用户。

在这个提示框中,我们看到了 Always Allow 这个选项,用户可以自身选择决定 App 在进入后台后是否需要继续定位。

始终允许 只有在出现提示框后用户点击 Always Allow 才会有交互事件。它只需要授权一次,可以直接请求定位或者升级的时候请求定位。

若没有选择 Always Allow,那么授权状态就会被 WhenInUse 取代,系统也不会再向用户展示提示框,而之前获得的定位也容易变得不准确。

Apple 的其他平台处理定位的方式不同。

  • tvOS 不支持 Always
  • watchOS 不需要 Always
  • macOS 没有 Alway 和 WhenInUse
  • Mac 的 iPad 应用 会两者择一使用

使用时允许变得更加强大


在 iOS 12 中,Always 可以接收定位、获取信标范围、在后台继续定位、在后台开启定位、监控位置变化、使用区域监控和访问监控。而 WhenInUse 只有前三者的功能。

在 iOS 13中,Always 不论 App 是否处于使用状态时,均可以使用 Core Location 的所有 API 。而 WhenInUse 只有在使用 App 时才可以使用 API。

那么,如何界定一个 App 是否在使用中呢?

(以下绿色区域均代表 App 处于使用中)

App 在前台以及进入后台之后的一小段时间里都是处于 In Use 状态。若进入后台之后时间过长,那么 App 会切换到 Not In Use,只有在下一次进入前台后 App 才会重新回到 In Use 状态。

CLLocationManager 有一个 allowsBackgroundLocationUpdates 的属性,默认值为 false 。将这个值设为 true 后,那么 App 进入后台之后可以继续更新定位。在进入后台和下一次进入前台的这段时间,App 依旧处于 In Use 状态。

对于 iWatch 来说,App 是始终处于 In Use 状态。

当系统触发本地通知,用户点击后,App 会进入前台,状态切换为 In Use

新增临时授权


在 iOS 12 中,Authorization States 最开始都是 .notDetermined。在出现请求权限弹窗用户授权之后,Authorization States 可能是被拒绝的、应用时允许或者是始终允许。也可以在应用时允许的状态下,通过设置allowsBackgroundLocationUpdates切换为始终允许。

在 iOS 13 中,会有 .authorizedAlways.authorizedWhenInUse 两种临时状态,而后者的时间更短暂。当 App 处于 In Use 状态下时,发起定位请求并且获得用户授权之后,那么临时状态就会处于整个 In Use 过程。

我们来看一下,在 iOS 13 中新增的临时授权有哪些特点。

  • Allow Once 是 临时属性,只允许一次。
  • 授权状态为 .authorizedWhenInUse
  • 下一次依旧需要请求授权。
  • 对于定位的开始和结束十分敏感。

总的来说,在 iOS 13中,新增了允许一次访问位置的临时授权,同时若 App 需要在后台获取定位系统也会通知用户,让用户及时知道哪些应用在追踪自己位置。对于用户来说,这无疑是一个利好。但对于开发者来说,时刻获取用户位置变得不再那么容易,一些依赖实时更新定位的 App,后期的开发与优化用户体验也是一个挑战。

参考资料:

© 著作权归作者所有
这个作品真棒,我要支持一下!
一年一度的 WWDC 又来啦!今年国内三大 iOS 组织(排名不分先后): 老司机 iOS 周报 知识小集 Sw...
4条评论

学习了!收获颇丰!

ok
#2

请教一下,core location更新看着更像是系统内部机制的完善,我们自己的app有什么可以适配的吗?虽然权限框多了only once选项,api中授权状态authorizationStatus还是以前的,并没有新增一个only once状态?

ok
#3

希望作者能解答一下困惑🙏🙏

#2楼 @ok 从跑demo来看 目前app只需要跟以前一样info.plist文件添加Privacy即可 only once是新增的选项,但它的authorizationStatus还是.authorizedWhenInUse

top Created with Sketch.