簡體   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