Geçici Daima yetkilendirmeyi geçici yapan nedir?

Aug 16 2020

Apple'a göre, Yetkilendirme "belirlenmediğinde" Çekirdek Konum uygulamanızdan Her zaman yetkilendirme almasını isterseniz, kullanıcı Kullanım Sırasında yetkilendirme için iletişim kutusunu görür ancak aslında uygulamanız geçici olarak Her Zaman yetkilendirme alır.

Bu, Her Zaman güçlerinizi gerçekten kullanmazsanız , Kullanımda olduğunda geri dönerek onları kaybedeceğiniz anlamına gelmelidir.

Tamam, ama bu geri dönüş ne zaman olacak? Bunu gerçekleştirecek gibi görünmüyorum. Kullanıcı bunun yalnızca Kullanım Sırasında yetkilendirmesi olduğunu düşünse bile uygulamam Her Zaman yetkilendirmede kalıyor .

Test uygulamamın tüm kodu (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())
    }
}

İki düğmeye ve bir etikete ihtiyacınız var. Başlama yetkiniz olmadığında ("belirlenmedi") her zaman yetkilendirme talebinde bulunmak için ilk düğmeye dokunun. Kullanımda olduğunda yetkilendirme iletişim kutusunu görürsünüz. Yetki verin. Şimdi uygulamayla oynayın ve etiketteki durum ekranını izlemeye devam edin. Gerekirse durumu güncellemek için ikinci düğmeye dokunabilirsiniz.

Sorun, her zaman kalmasıdır. Yetkilendirmenin Kullanımda Olduğunda geri dönmesi için "koşulum" ne zaman sona erecek? Bunun olmasını nasıl teşvik edebilirim?

Yanıtlar

5 Rob Aug 16 2020 at 04:12

WWDC 2019'un Core Location'daki Yenilikler bölümünde iOS 13.0'daki temel süreci ana hatlarıyla anlatıyorlar:

  1. Uygulamanız "her zaman" izin istiyor.

  2. Kullanıcı, "kullanımdayken" izin uyarısı görür, "her zaman" izin uyarısı görmez:

  3. Kullanıcı "kullanımdayken" izin verirse, uygulama "geçici her zaman" durumundadır.

    Bu durumda ve biraz kafa karıştırıcı bir şekilde, bu "geçici her zaman" durumunda olduğunuzda authorizationStatusgeri dönecektir .authorizedAlwaysve telefondaki Ayarlar uygulaması "kullanımdayken" durumunda olduğunu önerecektir. Ancak gerçekte, bu "geçici her zaman" durumundadır, authorizationStatuskişinin Ayarlar uygulamasında gördüklerinizden ne çıkarabileceği tam olarak değil .

    Söylemeye gerek yok, eğer kullanıcı "kullanımdayken" bile izin vermiyorsa (örneğin, "yalnızca bir kez" reddediyor veya seçiyorlarsa), o zaman açıkça "geçici her zaman" durumda olmayacaksınız.

  4. Videonun dediği gibi, "her zaman" yetkileri kullanmaya başlayana kadar "bu geçici durumda kalır. Örneğin, önemli bir değişiklik hizmeti başlatırsanız ve önemli bir değişikliği tetiklemeye yetecek bir mesafe hareket ettirirseniz.

    Uygulama "her zaman" güçleri kullanmaya başladığında ", işletim sistemi kullanıcıya" kullanımdayken "" her zaman "sürümüne yükseltme yapmak isteyip istemediğini soracaktır. (Her zaman hemen gerçekleşmez, ancak kullanıcının yaptığı işe geri dönmek için uyarıyı reddetme riskini azaltmak için başka şeyler yapmakla meşgul olmayana kadar bekleyecektir.)

Yani, başka bir duruma "geri dönmek" meselesi değil. Uygulama, nihai "anlaşma" (kullanıcının ikinci uyarıyı gördüğü ve yükseltmeyi kabul ettiği .authorizedAlwaysveya reddettiği ve olarak ayarlandığı .authorizedWhenInUse) kadar bu "geçici her zaman" durumunda kalacaktır .


Bunu bildiğinizi biliyorum, ancak gelecekteki okuyucuların iyiliği için:

WWDC 2020 videosunda Konumdaki yenilikler , iOS 13.4'te sunulan bir değişikliği açıklıyor. Yukarıdaki akış yerine ("her zaman" istediğiniz yerde, kullanıcı "kullanımdayken" izinleri görür ve "her zaman" hizmetler gerçekten tetiklenene kadar "her zaman yükseltmeyi" görmez), iOS 13.4 bir Yeni akış, "kullanımda" ("her zaman" yerine) isteyebileceğiniz ve kullanıcının bunu verdiğini varsayarak, daha sonra, uygun olduğunda uygulamada "her zaman" isteyebilirsiniz ve kullanıcı ikinci uyarıyı alır ( bu sefer kullanıcının "her zaman" sürüme geçmek isteyip istemediğini sorar). Sadece uygun izin dizelerine ihtiyacınız var.