![](/img/trans.png)
[英]iOS 13 check for provisional authorization status of CLLocationManager
[英]What makes provisional Always authorization provisional?
根据 Apple 的说法,如果您在“未确定”授权时要求您的 Core Location 应用程序获得 Always 授权,用户会看到“使用时”授权的对话框,但实际上您的应用程序会临时获得 Always 授权。
这应该意味着如果你没有真正使用你的 Always 能力,你将失去它们,恢复到使用时。
好的,但是什么时候会发生这种逆转? 我似乎无法实现它。 我的应用程序只是保持始终授权,即使用户认为它只是在使用时授权。
这是我的测试应用程序(iOS 14)的完整代码:
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var label: UILabel!
let locman = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locman.delegate = self
}
@IBAction func doAskForAlways(_ sender: Any) {
self.checkForLocationAccess(always:true)
}
func checkForLocationAccess(always:Bool = false, andThen f: (()->())? = nil) {
let status = self.locman.authorizationStatus()
switch status {
case .authorizedWhenInUse:
if always { // try to step up
self.locman.requestAlwaysAuthorization()
} else {
f?()
}
case .authorizedAlways:
f?()
case .notDetermined:
if always {
self.locman.requestAlwaysAuthorization()
} else {
self.locman.requestWhenInUseAuthorization()
}
case .restricted:
break
case .denied:
break
default: fatalError()
}
}
fileprivate func updateStatus(_ status: CLAuthorizationStatus) {
self.label.text = {
switch status {
case .authorizedAlways: return "Always"
case .authorizedWhenInUse: return "When In Use"
default: return ""
}
}()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
let status = manager.authorizationStatus()
print("authorization is", status.rawValue)
updateStatus(status)
}
@IBAction func doStatus(_ sender: Any) {
self.updateStatus(self.locman.authorizationStatus())
}
}
您需要两个按钮和一个 label。 当您无权开始时(“未确定”),点击第一个按钮以请求始终授权。 您会看到“使用时授权”对话框。 授予授权。 现在玩应用程序并继续观察 label 中的状态显示。 如果需要,您可以点击第二个按钮来更新状态。
问题是它始终保持不变。 我的“规定”何时结束,以便授权恢复为“使用时”? 我怎样才能鼓励这种情况发生?
在 WWDC 2019 的核心位置新增功能中,他们概述了 iOS 13.0 中的基本流程:
您的应用请求“始终”权限。
用户会看到“使用时”权限警报,而不是“始终”权限警报:
如果用户授予“使用时”,则应用程序处于“始终临时”state。
在这种情况下,有点令人困惑的是,当您处于此“临时始终”state 时, authorizationStatus
将返回.authorizedAlways
,并且手机上的“设置”应用程序将提示它处于“使用时”state 中。 但实际上,它存在于这个“临时性的”state 中,这与从authorizationStatus
或您在“设置”应用程序中看到的推断不同。
不用说,如果用户甚至没有授予“使用时”(例如,他们拒绝或选择“仅一次”),那么显然您不会处于“临时始终”state 中。
它保留在这个临时的 state 中,直到如视频所述,您“开始使用‘始终’的权力”。 例如,如果您启动重大变更服务并移动足以触发重大变更的距离。
当应用程序确实“开始使用 'always' 权限”时,操作系统会询问用户是否愿意将“when in use”升级为“always”。 (它不会总是立即发生,但会等到用户不忙于做其他事情,以减少他们为了回到他们正在做的事情而解除警报的风险。)
因此,这不是“恢复”到其他一些 state 的问题。 该应用程序将保留在此“临时始终” state 中,直到最终“同意”(用户看到第二个警报并同意升级到.authorizedAlways
或拒绝并设置为.authorizedWhenInUse
)。
我知道你知道这一点,但为了未来的读者:
在 WWDC 2020 视频What's new in location 中,他们描述了 iOS 13.4 中引入的更改。 iOS 13.4 不是上面的流程(您要求“始终”,用户看到“使用时”权限,并且在实际触发“始终”服务之前他们看不到“升级到始终”),iOS 13.4 引入了新流程,您可以在其中询问“使用时”(而不是“始终”)并假设用户授予它,您可以稍后在应用程序中的适当位置询问“始终”,并且用户会收到第二个警报(这次询问用户是否愿意升级到“始终”)。 您只需要适当的权限字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.