![](/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.