อะไรทำให้การอนุญาตชั่วคราวแบบชั่วคราวเสมอ

Aug 16 2020

ตามที่ Apple ระบุหากคุณขอให้แอปตำแหน่งหลักของคุณได้รับการอนุญาตเสมอเมื่อ "ไม่ได้กำหนดการอนุญาต" ผู้ใช้จะเห็นกล่องโต้ตอบสำหรับการอนุญาตเมื่อใช้งาน แต่ในความเป็นจริงแอปของคุณจะได้รับการอนุญาตเสมอ - ชั่วคราว

นี่ควรจะหมายความว่าหากคุณไม่ได้ใช้พลังตลอดเวลาจริงๆคุณจะสูญเสียพลังเหล่านั้นกลับไปเป็นเมื่อใช้

โอเค แต่การพลิกกลับนั้นจะเกิดขึ้นเมื่อใด ฉันไม่สามารถทำให้มันเกิดขึ้นได้ แอปของฉันยังคงอยู่ในการอนุญาตเสมอแม้ว่าผู้ใช้จะคิดว่าเป็นการอนุญาตเมื่อใช้งานเท่านั้น

นี่คือรหัสทั้งหมดของแอปทดสอบของฉัน (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())
    }
}

คุณต้องมีปุ่มสองปุ่มและป้ายกำกับ แตะปุ่มแรกเพื่อขอการอนุญาตเสมอเมื่อคุณไม่มีการอนุญาตให้เริ่มต้นด้วย ("ไม่ได้กำหนด") คุณจะเห็นกล่องโต้ตอบการอนุญาตเมื่อใช้งาน ให้สิทธิ์ ตอนนี้เล่นกับแอพและคอยดูการแสดงสถานะในป้ายกำกับ คุณสามารถแตะปุ่มที่สองเพื่ออัปเดตสถานะได้หากจำเป็น

ปัญหาคือมันอยู่ที่ Always "บทบัญญัติ" ของฉันจะสิ้นสุดลงเมื่อใดเพื่อให้การอนุญาตเปลี่ยนกลับเป็น "เมื่อใช้งาน" ฉันจะสนับสนุนให้สิ่งนี้เกิดขึ้นได้อย่างไร?

คำตอบ

5 Rob Aug 16 2020 at 04:12

ใน WWDC 2019 มีอะไรใหม่ในตำแหน่งหลักพวกเขาสรุปกระบวนการพื้นฐานใน iOS 13.0:

  1. แอปของคุณขออนุญาต "เสมอ"

  2. ผู้ใช้จะเห็นการแจ้งเตือนสิทธิ์“ เมื่อใช้งาน” ไม่ใช่การแจ้งเตือนสิทธิ์“ เสมอ”:

  3. หากผู้ใช้ให้สิทธิ์“ เมื่อใช้งาน” แอปจะอยู่ในสถานะ“ ชั่วคราวเสมอ”

    ในกรณีนี้และค่อนข้างสับสนauthorizationStatusจะกลับมา.authorizedAlwaysเมื่อคุณอยู่ในสถานะ "ชั่วคราวเสมอ" และแอปการตั้งค่าบนโทรศัพท์จะแนะนำให้อยู่ในสถานะ "เมื่อใช้งาน" แต่ในความเป็นจริงมันอยู่ในสถานะ "ชั่วคราวเสมอ" ซึ่งไม่ใช่สิ่งที่อาจอนุมานได้authorizationStatusหรือจากสิ่งที่คุณเห็นในแอปการตั้งค่า

    ไม่จำเป็นต้องพูดว่าหากผู้ใช้ไม่ได้ให้ "เมื่อใช้งาน" (เช่นพวกเขาปฏิเสธหรือเลือก "เพียงครั้งเดียว") เห็นได้ชัดว่าคุณจะไม่อยู่ในสถานะ "ชั่วคราวเสมอไป"

  4. มันยังคงอยู่ในสถานะชั่วคราวนี้จนกว่าวิดีโอจะบอกว่าคุณ "เริ่มใช้พลัง" เสมอ "" ตัวอย่างเช่นหากคุณเริ่มบริการการเปลี่ยนแปลงที่สำคัญและย้ายระยะทางเพียงพอที่จะทำให้เกิดการเปลี่ยนแปลงที่สำคัญ

    เมื่อแอป "เริ่มใช้งาน" เสมอ "ระบบปฏิบัติการจะถามผู้ใช้ว่ายินดีที่จะอัปเกรด" เมื่อใช้งาน "เป็น" เสมอ "หรือไม่ (จะไม่เกิดขึ้นทันทีเสมอไป แต่จะรอจนกว่าผู้ใช้จะไม่ยุ่งกับการทำสิ่งอื่นเพื่อลดความเสี่ยงที่พวกเขาจะปิดการแจ้งเตือนเพื่อกลับไปทำสิ่งที่พวกเขากำลังทำอยู่)

ดังนั้นจึงไม่ใช่คำถามของการ "เปลี่ยนกลับ" ไปเป็นสถานะอื่น แอปจะยังคงอยู่ในสถานะ "ชั่วคราวเสมอ" นี้จนกว่าจะมี "ข้อตกลง" ขั้นสุดท้าย (ซึ่งผู้ใช้จะเห็นการแจ้งเตือนครั้งที่สองและตกลงที่จะอัปเกรด.authorizedAlwaysหรือปฏิเสธและตั้งค่าเป็น.authorizedWhenInUse)


ฉันรู้ว่าคุณรู้เรื่องนี้ แต่เพื่อประโยชน์ของผู้อ่านในอนาคต:

ในวิดีโอ WWDC 2020 มีอะไรใหม่ในสถานที่เหล่านี้อธิบายถึงการเปลี่ยนแปลงที่เกิดขึ้นใน iOS 13.4 แทนที่จะเป็นขั้นตอนด้านบน (ที่คุณขอ "เสมอ" ผู้ใช้จะเห็นสิทธิ์ "เมื่อใช้งาน" และไม่เห็นการ "อัปเกรดเป็นเสมอ" จนกว่าบริการ "เสมอ" จะถูกเรียกใช้) iOS 13.4 ได้แนะนำ ขั้นตอนใหม่ซึ่งคุณสามารถขอ“ เมื่อใช้งาน” (แทนที่จะเป็น“ เสมอ”) และสมมติว่าผู้ใช้มอบให้คุณสามารถขอ“ เสมอ” ได้ในภายหลังตามความเหมาะสมในแอปและผู้ใช้จะได้รับการแจ้งเตือนครั้งที่สอง ( คราวนี้ถามว่าผู้ใช้ต้องการอัปเกรดเป็น“ เสมอ” หรือไม่) คุณต้องมีสตริงสิทธิ์ที่เหมาะสม