Cosa rende provvisoria l'autorizzazione Sempre provvisoria?

Aug 16 2020

Secondo Apple, se chiedi alla tua app Core Location di ottenere l'autorizzazione Sempre quando l'autorizzazione è "non determinata", l'utente vede la finestra di dialogo per l'autorizzazione Quando in uso, ma in realtà la tua app ottiene l'autorizzazione Sempre, in via provvisoria.

Questo dovrebbe significare che se non usi effettivamente i tuoi poteri Sempre, li perderai, tornando a Quando in uso.

Ok, ma quando avverrà quel ritorno? Non riesco a farlo accadere. La mia app rimane solo su Autorizzazione sempre, anche se l' utente pensa che sia solo Autorizzazione quando in uso.

Ecco l'intero codice della mia app di test (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())
    }
}

Hai bisogno di due pulsanti e un'etichetta. Toccare il primo pulsante per richiedere l'autorizzazione Sempre quando non si dispone dell'autorizzazione con cui iniziare ("non determinato"). Viene visualizzata la finestra di dialogo di autorizzazione When In Use. Concedere l'autorizzazione. Ora gioca con l'app e continua a guardare la visualizzazione dello stato nell'etichetta. Puoi toccare il secondo pulsante per aggiornare lo stato, se necessario.

Il problema è che rimane su Always. Quando terminerà la mia "fornitura" in modo che l'autorizzazione ritorni a When In Use? Come posso incoraggiare che ciò accada?

Risposte

5 Rob Aug 16 2020 at 04:12

In What's New in Core Location del WWDC 2019 , delineano il processo di base in iOS 13.0:

  1. La tua app richiede l'autorizzazione "sempre".

  2. L'utente visualizza un avviso di autorizzazione "quando in uso", non un avviso di autorizzazione "sempre":

  3. Se l'utente concede "quando in uso", l'app è in stato "sempre provvisorio".

    In questo caso, e in modo un po' confuso, authorizationStatustornerà .authorizedAlwaysquando ci si trova in questo stato "sempre provvisorio" e l'app Impostazioni sul telefono suggerirà che si trova nello stato "quando in uso". Ma in realtà, è in questo stato "sempre provvisorio", non proprio quello che si potrebbe dedurre da authorizationStatusné da ciò che vedi nell'app Impostazioni.

    Inutile dire che se l'utente non concede nemmeno “quando in uso” (es. nega o sceglie “solo una volta”), allora ovviamente non sarai nello stato “sempre provvisorio”.

  4. Rimane in questo stato provvisorio fino a quando, come dice il video, “inizia a usare i poteri 'sempre'”. Ad esempio, se avvii un servizio di cambio significativo e ti sposti di una distanza sufficiente per attivare un cambiamento significativo.

    Quando l'app "inizia a utilizzare i poteri 'sempre'", il sistema operativo chiederà all'utente se desidera eseguire l'aggiornamento da "quando in uso" a "sempre". (Non accadrà sempre immediatamente, ma aspetterà fino a quando l'utente non è impegnato a fare altre cose, per ridurre il rischio che ignorino l'avviso solo per tornare a quello che stavano facendo.)

Quindi, non si tratta di “ritornare” a qualche altro stato. L'app rimarrà in questo stato "sempre provvisorio" fino a quando non vi sarà un "accordo" finale (dove l'utente vede il secondo avviso e accetta di eseguire l'aggiornamento a .authorizedAlwaysoppure nega ed è impostato su .authorizedWhenInUse).


So che lo sai, ma per il bene dei futuri lettori:

Nel video WWDC 2020 What's new in location , descrivono una modifica introdotta in iOS 13.4. Invece del flusso sopra (dove chiedi "sempre", l'utente vede le autorizzazioni "quando in uso" e non vede l'"aggiornamento a sempre" fino a quando i servizi "sempre" non vengono effettivamente attivati), iOS 13.4 ha introdotto un nuovo flusso, dove puoi chiedere "quando in uso" (anziché "sempre") e supponendo che l'utente lo abbia concesso, puoi chiedere "sempre" in seguito, se appropriato nell'app, e l'utente riceve il secondo avviso ( questa volta chiedendo se l'utente desidera eseguire l'aggiornamento a "sempre" oppure no). Hai solo bisogno delle stringhe di autorizzazione appropriate.