web-dev-qa-db-fra.com

Demander à nouveau des autorisations après que l'utilisateur a refusé les services de localisation?

Je surveille l'emplacement de l'utilisateur et demande la permission lorsque mon chargement se charge pour la première fois en utilisant ceci:

locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()

Si l'utilisateur nie, mais change d'avis plus tard en activant l'option de configuration dans mon application, comment puis-je demander à nouveau? Par exemple, j'ai un commutateur pour détecter automatiquement l'emplacement de l'utilisateur, alors quand ils l'activent, j'essaie de le faire:

@IBAction func gpsChanged(sender: UISwitch) {
    // Request permission for auto geolocation if applicable
    if sender.on {
        locationManager.requestAlwaysAuthorization()
        locationManager.startUpdatingLocation()
    }
}

Mais ce code ne semble rien faire. J'espérais qu'il demanderait à nouveau à l'utilisateur s'il souhaite autoriser l'application à suivre la position de l'utilisateur. Est-ce possible?

23
TruMan1

Le système d'exploitation ne demandera à l'utilisateur qu'une seule fois. S'ils refusent la permission, c'est tout. Ce que vous pouvez faites, c'est diriger l'utilisateur vers les paramètres de votre application en passant UIApplicationOpenSettingsURLString à UIApplication's openURL: méthode. De là, ils peuvent réactiver les services de localisation s'ils le souhaitent. Cela dit, vous ne devriez probablement pas être trop agressif pour les mettre sur écoute pour la permission.

53
bgilham

La fenêtre contextuelle d'autorisation ne s'affiche qu'une seule fois. Nous devons donc rediriger les utilisateurs vers Paramètres après cela. Voici le code dans Swift:

 import CoreLocation 
 @IBAction func userDidClickButton(_ sender: Any) {

    // initialise a pop up for using later
    let alertController = UIAlertController(title: "TITLE", message: "Please go to Settings and turn on the permissions", preferredStyle: .alert)
    let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }
        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in })
         }
    }
    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alertController.addAction(cancelAction)
    alertController.addAction(settingsAction)

    // check the permission status
    switch(CLLocationManager.authorizationStatus()) {
        case .authorizedAlways, .authorizedWhenInUse:
            print("Authorize.")
            // get the user location
        case .notDetermined, .restricted, .denied:
            // redirect the users to settings
            self.present(alertController, animated: true, completion: nil)
    }
}
12
Allen

Vous pouvez avoir une solution alternative !! Vous pouvez afficher votre propre alerte avec le meilleur message qui peut convaincre votre utilisateur d'autoriser la réception de notifications Push pour votre application. Si l'utilisateur le permet, vous ne montrez que l'alerte d'autorisation par défaut pour activer la notification Push.Si l'utilisateur ne le permet pas, n'affichez pas l'alerte par défaut en fait, vous pouvez enregistrer l'indicateur correspondant dans votre base de données ou NSUserDefaults et pouvez demander à l'utilisateur plus tard encore et encore sur certains événements dans votre application.

2
Khushabu

J'ai créé la bibliothèque qui inclut le gestionnaire d'autorisations pour la notification qui gère l'alerte d'autorisation même après que l'utilisateur a refusé l'autorisation.

https://github.com/CrazyPro007/PermissionManager/tree/master/PermissionManager/PermissionManager

1
CrazyPro007

Tu n'as qu'une chance. Pour que l'utilisateur active les autorisations après les avoir refusées, il doit passer par l'application Paramètres. Voir Demande d'autorisation d'utilisation des services de localisation dans CLLocationManager .

1
Connor