Điều gì làm cho việc ủy ​​quyền Luôn luôn tạm thời là tạm thời?

Aug 16 2020

Theo Apple, nếu bạn yêu cầu ứng dụng Vị trí cốt lõi của mình nhận ủy quyền Luôn luôn khi ủy quyền "chưa được xác định", người dùng sẽ thấy hộp thoại ủy quyền Khi sử dụng nhưng trên thực tế, ứng dụng của bạn được ủy quyền Luôn luôn - tạm thời.

Điều này có nghĩa là nếu bạn không thực sự sử dụng quyền năng Luôn luôn của mình, bạn sẽ mất chúng, hoàn nguyên về trạng thái Khi sử dụng.

Được rồi, nhưng khi nào thì sự đảo ngược đó sẽ xảy ra? Tôi dường như không thể làm cho nó xảy ra. Ứng dụng của tôi chỉ ở chế độ Luôn cấp quyền, mặc dù người dùng nghĩ rằng đó chỉ là ủy quyền Khi Sử dụng.

Đây là toàn bộ mã của ứng dụng thử nghiệm của tôi (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())
    }
}

Bạn cần hai nút và một nhãn. Nhấn vào nút đầu tiên để yêu cầu Luôn ủy quyền khi bạn không có ủy quyền để bắt đầu ("không được xác định"). Bạn thấy hộp thoại ủy quyền Khi Sử dụng. Cấp quyền. Bây giờ chơi với ứng dụng và tiếp tục xem hiển thị trạng thái trong nhãn. Bạn có thể nhấn vào nút thứ hai để cập nhật trạng thái nếu cần.

Vấn đề là nó vẫn ở Always. Khi nào thì "điều khoản" của tôi kết thúc để ủy quyền hoàn nguyên về Khi nào được sử dụng? Làm thế nào tôi có thể khuyến khích điều này xảy ra?

Trả lời

5 Rob Aug 16 2020 at 04:12

Trong Có gì mới trong Vị trí cốt lõi của WWDC 2019 , họ phác thảo quy trình cơ bản trong iOS 13.0:

  1. Ứng dụng của bạn yêu cầu quyền "luôn luôn".

  2. Người dùng thấy cảnh báo quyền “khi sử dụng”, không phải cảnh báo quyền “luôn luôn”:

  3. Nếu người dùng cấp "khi sử dụng", ứng dụng ở trạng thái "luôn tạm thời".

    Trong trường hợp này, và hơi khó hiểu, authorizationStatusnó sẽ trở lại .authorizedAlwayskhi bạn ở trạng thái “tạm thời luôn luôn” này và ứng dụng Cài đặt trên điện thoại sẽ gợi ý rằng nó ở trạng thái “khi đang sử dụng”. Nhưng trên thực tế, nó ở trạng thái “tạm thời luôn luôn” này, không hoàn toàn như những gì người ta có thể suy ra authorizationStatuscũng như từ những gì bạn thấy trong ứng dụng Cài đặt.

    Không cần phải nói, nếu người dùng thậm chí không cấp “khi sử dụng” (ví dụ: họ từ chối hoặc chọn “chỉ một lần”), thì rõ ràng bạn sẽ không ở trạng thái “tạm thời luôn luôn”.

  4. Nó vẫn ở trạng thái tạm thời này cho đến khi, như video cho biết, bạn "bắt đầu sử dụng" quyền hạn "luôn luôn". Ví dụ: nếu bạn bắt đầu dịch vụ thay đổi quan trọng và di chuyển một khoảng cách đủ để kích hoạt một thay đổi quan trọng.

    Khi ứng dụng "bắt đầu sử dụng" quyền hạn "luôn luôn", hệ điều hành sẽ hỏi người dùng xem họ có sẵn sàng nâng cấp "khi sử dụng" lên "luôn luôn" hay không. (Nó không phải lúc nào cũng xảy ra ngay lập tức, nhưng sẽ đợi cho đến khi người dùng không bận làm những việc khác, để giảm nguy cơ họ sẽ loại bỏ cảnh báo chỉ để quay lại những gì họ đang làm.)

Vì vậy, vấn đề không phải là "hoàn nguyên" về một số trạng thái khác. Ứng dụng sẽ vẫn ở trạng thái “tạm thời luôn luôn” này cho đến khi có “thỏa thuận” cuối cùng (khi người dùng nhìn thấy cảnh báo thứ hai và đồng ý nâng cấp lên .authorizedAlwayshoặc từ chối và nó được đặt thành .authorizedWhenInUse).


Tôi biết bạn biết điều này, nhưng vì lợi ích của độc giả trong tương lai:

Trong video WWDC 2020 Có gì mới ở vị trí , họ mô tả một thay đổi được giới thiệu trong iOS 13.4. Thay vì quy trình ở trên (nơi bạn yêu cầu “luôn luôn”, người dùng thấy các quyền “khi sử dụng” và họ không thấy “nâng cấp lên luôn luôn” cho đến khi các dịch vụ “luôn luôn” thực sự được kích hoạt), iOS 13.4 đã giới thiệu một luồng mới, nơi bạn có thể yêu cầu "khi nào được sử dụng" (thay vì "luôn luôn") và giả sử người dùng đã cấp nó, bạn có thể yêu cầu "luôn luôn" sau đó, nếu thích hợp trong ứng dụng và người dùng nhận được cảnh báo thứ hai ( lần này hỏi người dùng có muốn nâng cấp lên “luôn luôn” hay không). Bạn chỉ cần các chuỗi quyền thích hợp.