อะไรทำให้การอนุญาตชั่วคราวแบบชั่วคราวเสมอ
ตามที่ 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 "บทบัญญัติ" ของฉันจะสิ้นสุดลงเมื่อใดเพื่อให้การอนุญาตเปลี่ยนกลับเป็น "เมื่อใช้งาน" ฉันจะสนับสนุนให้สิ่งนี้เกิดขึ้นได้อย่างไร?
คำตอบ
ใน WWDC 2019 มีอะไรใหม่ในตำแหน่งหลักพวกเขาสรุปกระบวนการพื้นฐานใน iOS 13.0:
แอปของคุณขออนุญาต "เสมอ"
ผู้ใช้จะเห็นการแจ้งเตือนสิทธิ์“ เมื่อใช้งาน” ไม่ใช่การแจ้งเตือนสิทธิ์“ เสมอ”:
หากผู้ใช้ให้สิทธิ์“ เมื่อใช้งาน” แอปจะอยู่ในสถานะ“ ชั่วคราวเสมอ”
ในกรณีนี้และค่อนข้างสับสน
authorizationStatus
จะกลับมา.authorizedAlways
เมื่อคุณอยู่ในสถานะ "ชั่วคราวเสมอ" และแอปการตั้งค่าบนโทรศัพท์จะแนะนำให้อยู่ในสถานะ "เมื่อใช้งาน" แต่ในความเป็นจริงมันอยู่ในสถานะ "ชั่วคราวเสมอ" ซึ่งไม่ใช่สิ่งที่อาจอนุมานได้authorizationStatus
หรือจากสิ่งที่คุณเห็นในแอปการตั้งค่าไม่จำเป็นต้องพูดว่าหากผู้ใช้ไม่ได้ให้ "เมื่อใช้งาน" (เช่นพวกเขาปฏิเสธหรือเลือก "เพียงครั้งเดียว") เห็นได้ชัดว่าคุณจะไม่อยู่ในสถานะ "ชั่วคราวเสมอไป"
มันยังคงอยู่ในสถานะชั่วคราวนี้จนกว่าวิดีโอจะบอกว่าคุณ "เริ่มใช้พลัง" เสมอ "" ตัวอย่างเช่นหากคุณเริ่มบริการการเปลี่ยนแปลงที่สำคัญและย้ายระยะทางเพียงพอที่จะทำให้เกิดการเปลี่ยนแปลงที่สำคัญ
เมื่อแอป "เริ่มใช้งาน" เสมอ "ระบบปฏิบัติการจะถามผู้ใช้ว่ายินดีที่จะอัปเกรด" เมื่อใช้งาน "เป็น" เสมอ "หรือไม่ (จะไม่เกิดขึ้นทันทีเสมอไป แต่จะรอจนกว่าผู้ใช้จะไม่ยุ่งกับการทำสิ่งอื่นเพื่อลดความเสี่ยงที่พวกเขาจะปิดการแจ้งเตือนเพื่อกลับไปทำสิ่งที่พวกเขากำลังทำอยู่)
ดังนั้นจึงไม่ใช่คำถามของการ "เปลี่ยนกลับ" ไปเป็นสถานะอื่น แอปจะยังคงอยู่ในสถานะ "ชั่วคราวเสมอ" นี้จนกว่าจะมี "ข้อตกลง" ขั้นสุดท้าย (ซึ่งผู้ใช้จะเห็นการแจ้งเตือนครั้งที่สองและตกลงที่จะอัปเกรด.authorizedAlways
หรือปฏิเสธและตั้งค่าเป็น.authorizedWhenInUse
)
ฉันรู้ว่าคุณรู้เรื่องนี้ แต่เพื่อประโยชน์ของผู้อ่านในอนาคต:
ในวิดีโอ WWDC 2020 มีอะไรใหม่ในสถานที่เหล่านี้อธิบายถึงการเปลี่ยนแปลงที่เกิดขึ้นใน iOS 13.4 แทนที่จะเป็นขั้นตอนด้านบน (ที่คุณขอ "เสมอ" ผู้ใช้จะเห็นสิทธิ์ "เมื่อใช้งาน" และไม่เห็นการ "อัปเกรดเป็นเสมอ" จนกว่าบริการ "เสมอ" จะถูกเรียกใช้) iOS 13.4 ได้แนะนำ ขั้นตอนใหม่ซึ่งคุณสามารถขอ“ เมื่อใช้งาน” (แทนที่จะเป็น“ เสมอ”) และสมมติว่าผู้ใช้มอบให้คุณสามารถขอ“ เสมอ” ได้ในภายหลังตามความเหมาะสมในแอปและผู้ใช้จะได้รับการแจ้งเตือนครั้งที่สอง ( คราวนี้ถามว่าผู้ใช้ต้องการอัปเกรดเป็น“ เสมอ” หรือไม่) คุณต้องมีสตริงสิทธิ์ที่เหมาะสม