Was macht die vorläufige Always-Autorisierung zu einer vorläufigen?

Aug 16 2020

Wenn Sie laut Apple darum bitten, dass Ihre Core Location-App die Always-Autorisierung erhält, wenn die Autorisierung „nicht bestimmt“ ist, sieht der Benutzer das Dialogfeld für die When In Use-Autorisierung, aber tatsächlich erhält Ihre App die Always-Autorisierung – vorläufig.

Dies soll bedeuten, dass Sie Ihre Always-Kräfte verlieren , wenn Sie sie nicht tatsächlich verwenden , und zu When In Use zurückkehren.

Okay, aber wann wird diese Umkehrung stattfinden? Ich schaffe es einfach nicht. Meine App bleibt einfach bei der Always-Autorisierung, obwohl der Benutzer denkt, dass es sich nur um eine When-In-Use-Autorisierung handelt.

Hier ist der gesamte Code meiner Test-App (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())
    }
}

Sie benötigen zwei Knöpfe und ein Etikett. Tippen Sie auf die erste Schaltfläche, um nach der Immer-Autorisierung zu fragen, wenn Sie zunächst keine Autorisierung haben ("nicht bestimmt"). Sie sehen den Autorisierungsdialog When In Use. Berechtigung erteilen. Spielen Sie nun mit der App und beobachten Sie weiterhin die Statusanzeige im Etikett. Sie können auf die zweite Schaltfläche tippen, um den Status bei Bedarf zu aktualisieren.

Das Problem ist, dass es bei Always bleibt. Wann endet meine „Bereitstellung“, sodass die Berechtigung wieder auf When In Use zurückgeht? Wie kann ich das fördern?

Antworten

5 Rob Aug 16 2020 at 04:12

In What’s New in Core Location der WWDC 2019 skizzieren sie den grundlegenden Prozess in iOS 13.0:

  1. Ihre App fordert die Berechtigung „immer“ an.

  2. Der Benutzer sieht die Berechtigungswarnung „wenn verwendet“, nicht die Berechtigungswarnung „immer“:

  3. Wenn der Benutzer „wenn in Gebrauch“ gewährt, befindet sich die App im Zustand „immer vorläufig“.

    In diesem Fall, und etwas verwirrend, kehrt das authorizationStatuszurück, .authorizedAlwayswenn Sie sich in diesem Zustand „vorläufig immer“ befinden, und die Einstellungs-App auf dem Telefon schlägt vor, dass es sich im Zustand „wenn verwendet“ befindet. Aber in Wirklichkeit befindet es sich in diesem „immer vorläufigen“ Zustand, nicht ganz das, was man daraus schließen könnte, authorizationStatusnoch aus dem, was Sie in der App „Einstellungen“ sehen.

    Es versteht sich von selbst, dass wenn der Benutzer nicht einmal „bei Verwendung“ gewährt (z. B. „nur einmal“ ablehnt oder wählt), dann befinden Sie sich offensichtlich nicht im „vorläufig immer“-Zustand.

  4. Es bleibt in diesem vorläufigen Zustand, bis Sie, wie das Video sagt, „beginnen, ‚Immer‘-Kräfte zu verwenden“. Zum Beispiel, wenn Sie den Service für signifikante Änderungen starten und sich um eine ausreichende Entfernung bewegen, um eine signifikante Änderung auszulösen.

    Wenn die App beginnt, „immer“ Befugnisse zu verwenden, fragt das Betriebssystem den Benutzer, ob er bereit ist, „bei Verwendung“ auf „immer“ zu aktualisieren. (Dies geschieht nicht immer sofort, sondern wartet, bis der Benutzer nicht mit anderen Dingen beschäftigt ist, um das Risiko zu verringern, dass er die Warnung verwirft, nur um zu dem zurückzukehren, was er gerade getan hat.)

Es geht also nicht darum, in einen anderen Zustand „zurückzukehren“. Die App bleibt in diesem „immer vorläufigen“ Zustand, bis es eine endgültige „Zustimmung“ gibt (wobei der Benutzer die zweite Warnung sieht und entweder dem Upgrade zustimmt .authorizedAlwaysoder ablehnt und es auf eingestellt ist .authorizedWhenInUse).


Ich weiß, dass Sie das wissen, aber für zukünftige Leser:

Im WWDC 2020-Video What’s new in location beschreiben sie eine Änderung, die in iOS 13.4 eingeführt wurde. Anstelle des obigen Ablaufs (bei dem Sie nach „immer“ fragen, sieht der Benutzer „wenn verwendet“-Berechtigungen und er sieht das „Upgrade auf immer“ nicht, bis „immer“-Dienste tatsächlich ausgelöst werden) führte iOS 13.4 ein neuer Ablauf, bei dem Sie nach „wenn in Gebrauch“ fragen können (anstelle von „immer“) und vorausgesetzt, der Benutzer hat es gewährt, können Sie später nach „immer“ fragen, wo dies in der App angemessen ist, und der Benutzer erhält die zweite Benachrichtigung ( dieses Mal gefragt, ob der Benutzer auf „immer“ aktualisieren möchte oder nicht). Sie benötigen lediglich die entsprechenden Berechtigungszeichenfolgen.