web-dev-qa-db-fra.com

Problème d'autorisation d'emplacement iOS 11 et iOS 10

J'ai un problème lorsque je demande des autorisations d'emplacement à un utilisateur lorsque j'utilise iOS11 et que mon info.plist contient

<key>NSLocationWhenInUseUsageDescription</key>
<string>When in use permissions</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>always permissions</string>
<key>NSLocationAlwaysAndWhenInUsageDescription</key>
<string>Always and in usage permissions</string>

J'ai deux cartes, l'une pour le client et l'autre pour les employés. Pour les employés, j'ai besoin de connaître leur emplacement même si l'application n'est pas en cours d'exécution ou n'a pas de fond d'écran (ils peuvent l'éteindre lors de la déconnexion) et demander l'autorisation à l'aide de

locationManager.requestAlwaysAuthorization()

Pour les clients, je n'ai besoin d'emplacements que lorsque l'application est en cours d'utilisation et je demande l'autorisation à l'aide de

locationManager.requestWhenInUseAuthorization()

Dans iOS 11, cela ne demande une autorisation que lorsqu’il est utilisé et jamais l’autorisation toujours active.

Dans iOS 10, le comportement est correct.

Le comportement que je souhaite est le suivant: lorsqu'il s'agit d'un client (non connecté), il ne demande que l'autorisation en cours d'utilisation. S'ils se connectent (employé), il demande l'emplacement même s'il n'est pas utilisé.

Si quelqu'un pouvait nous éclairer sur ce qui me manquait ou si je me trompais, ce serait très apprécié.

Quelque chose à noter si je supprime la permission NSLocationAlwaysUsageDescription iOS10 et iOS11 ont le même problème de ne pas demander toujours la permission.

Un peu plus de clarification. J'ai implémenté la fonction déléguée didChangeAuthorization et elle est appelée lorsqu'un utilisateur autorise l'autorisation d'alerte d'appeler requestWhenInUseAuthorization(). Cependant, lorsque j'appelle la fonction requestWhenInUseAuthorization() sur le gestionnaire d'emplacement, la méthode déléguée n'est pas appelée, c'est comme si elle ne recevait jamais cet appel et qu'aucune boîte de dialogue d'alerte ne s'affiche. à l'utilisateur.

13
Ben Avery

J'ai résolu le problème en créant une application autonome rapide qui ne demandait que des autorisations. On m'a donné un journal des erreurs qui indiquait que les clés que j'utilisais étaient incorrectes. 

J'ai eu NSLocationAlwaysAndWhenInUsageDescription au lieu de NSLocationAlwaysAndWhenInUseUsageDescription, ce qui est étrange car, dans docs , il est indiqué que NSLocationAlwaysAndWhenInUsageDescription devrait être utilisé. Le fait d'inclure le problème de clé corrigé correct et les autorisations fonctionne comme prévu pour iOS 11 et 10.

Merci pour votre aide.

8
Ben Avery

Dans votre fichier info.plist, ajoutez ceci:

<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

Maintenant, dans votre fichier Swift, n'oubliez pas d'ajouter un délégué: CLLocationManagerDelegate

Dans votre viewDiDLoad (), ajoutez ceci:

locationManager = CLLocationManager()

locationManager.delegate = self

locationManager.requestWhenInUseAuthorization()

locationManager.desiredAccuracy = kCLLocationAccuracyBest

locationManager.startUpdatingLocation()

locationManager.startMonitoringSignificantLocationChanges()

// Here you can check whether you have allowed the permission or not.

if CLLocationManager.locationServicesEnabled()
    {
        switch(CLLocationManager.authorizationStatus())
        {

        case .authorizedAlways, .authorizedWhenInUse:

            print("Authorize.")

            break

        case .notDetermined:

            print("Not determined.")

            break

        case .restricted:

            print("Restricted.")

            break

        case .denied:

            print("Denied.")
        }
    }
4
Akhil Nair

Pour les deux cas, clients et employés, vous devez d'abord appeler locationManager.requestWhenInUseAuthorization()

Ensuite, uniquement s’il s’agit d’employés, ajoutez un appel à locationManager.requestAlwaysAuthorization()

Voir https://developer.Apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization

Vue d'ensemble Pour toujours configurer l'autorisation pour les services de localisation, faites Ce qui suit: Ajoutez la clé NSLocationWhenInUseUsageDescription et le NSLocationAlwaysAndWhenInUsageDescription à votre fichier Info.plist . (Xcode affiche ces clés comme suit: "Confidentialité - Emplacement en cours d'utilisation Description" et "Confidentialité - Emplacement toujours et en cours d'utilisation Description" dans l'éditeur Info.plist.) Si votre application prend en charge iOS 10 et plus tôt, ajoutez la clé NSLocationAlwaysUsageDescription à votre Fichier Info.plist. (Xcode affiche cette clé comme suit: "Confidentialité - Emplacement Description toujours de l'utilisation" dans l'éditeur Info.plist.) Créer et configurez votre objet CLLocationManager. Appeler le requestWhenInUseAuthorization () initialement pour activer le .__ de base de votre application. support de localisation. Appelez uniquement la méthode requestAlwaysAuthorization () lorsque vous utilisez des services nécessitant ce niveau d'autorisation.

0
Roee84