繁体   English   中英

是什么让临时性 Always 授权是临时性的?

[英]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 中的基本流程:

  1. 您的应用请求“始终”权限。

  2. 用户会看到“使用时”权限警报,而不是“始终”权限警报:

    在此处输入图像描述

  3. 如果用户授予“使用时”,则应用程序处于“始终临时”state。

    在这种情况下,有点令人困惑的是,当您处于此“临时始终”state 时, authorizationStatus将返回.authorizedAlways ,并且手机上的“设置”应用程序将提示它处于“使用时”state 中。 但实际上,它存在于这个“临时性的”state 中,这与从authorizationStatus或您在“设置”应用程序中看到的推断不同。

    不用说,如果用户甚至没有授予“使用时”(例如,他们拒绝或选择“仅一次”),那么显然您不会处于“临时始终”state 中。

  4. 它保留在这个临时的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM