web-dev-qa-db-fra.com

Les services de localisation ne fonctionnent pas sous iOS 11

Je viens de reconstruire mon application avec le SDK iOS 11 dans le but de supprimer le blue banner qui apparaît toujours. Je pensais - "Brillant, ça a marché", seulement pour découvrir que les services de localisation ne fonctionnent plus du tout.

L’application fonctionnait avec iOS 10 - Quelqu'un at-il entendu quelque chose?

80
William George

Il semblerait que Apple ait ajouté une autre fonctionnalité de confidentialité. L'utilisateur peut maintenant remplacer notre requestAlwaysAuthorization et le rétrograder à requestWhenInUseAuthorization - ce qui signifie qu'en tant que développeur, nous devons maintenant fournir les deux descriptions dans le Info.plist.

J'ai trouvé qu'ils ont ajouté une nouvelle clé NSLocationAlwaysAndWhenInUseUsageDescription

/*
*      Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the
*      NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription
*      keys must be specified in your Info.plist; otherwise, this method will do
*      nothing, as your app will be assumed not to support Always authorization.
*/

Cependant, lors de l'utilisation de cette nouvelle clé - le service de localisation ne fonctionnait toujours pas, j'ai ensuite trouvé ce joyau mélangé à toutes les informations de débogage supplémentaires:

Cette application a tenté d'accéder à des données confidentielles sans description d'utilisation. L'info.plist de l'application doit contenir les clés NSLocationAlwaysAndWhenInUseUsageDescription et NSLocationWhenInUseUsageDescription avec des valeurs de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Ce qui contredit directement le commentaire que j'ai trouvé dans le fichier CLLocationManager.h mis à jour. J'ai donc créé un radar.

Bonne nouvelle, si vous suivez les conseils de la console de débogage, IE. ajoutez à la fois la nouvelle clé NSLocationAlwaysAndWhenInUseUsageDescription et l’une des anciennes clés NSLocationWhenInUseUsageDescription, les services de localisation recommenceront à fonctionner.

154
William George

Juste pour ajouter les étapes pour résoudre ceci:

2 façons de le faire:

A) Le moyen le plus simple: sélectionnez votre fichier Info.plist, ajoutez les propriétés, notez qu'elles commencent par PRIVCY au lieu de LOCATION ... par conséquent, les noms exacts de ces variables commencent par "Privacy - Location ..." etc, ajoutez chacun ici, et décrivez comment l’utilisateur verrait cela dans l’avertissement.

B) La manière difficile/intéressante/programmatique (j'aime plus cette façon):

Faites un clic droit sur votre Info.plist pour votre application, puis sélectionnez "Afficher le code source", vous devriez voir tout cela en XML,

Suivez l’autre format ...... et ajoutez ces propriétés comme suit:

<key>NSLocationAlwaysUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Program requires GPS to track cars and job orders</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>

Cliquez sur Enregistrer, puis cliquez avec le bouton droit de la souris sur le fichier info.plist, puis sélectionnez Liste de propriétés. Le fichier devrait alors être redéfini dans la vue par défaut.

MODIFIER:

Un autre membre a demandé du code, le voici:

1) Sur votre fichier .H, ajoutez:

@property (strong, nonatomic) CLLocationManager *LocationManager;

2) Dans votre fichier .M, ajoutez la fonction ViewDidAppear ():

_LocationManager = [[CLLocationManager alloc] init];
[_LocationManager setDelegate:self];
_LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
_LocationManager.pausesLocationUpdatesAutomatically = NO;
[_LocationManager requestAlwaysAuthorization];

_LocationManager.headingFilter = 5;
_LocationManager.distanceFilter = 0;

[_LocationManager startUpdatingLocation];
[_LocationManager startUpdatingHeading];

Ce qui fonctionne bien pour moi, j'espère que le code fonctionnerait pour vous aussi.

Cordialement

Heider

39
Heider Sati

travaillant sous iOS11, j’ai découvert qu’Info.plist avait au moins besoin de NSLocationAlwaysAndWhenInUseUsageDescription in Info.plist:

enter image description here

Etrange quand votre application est multilingue , les versions localisées de vos chaînes ont besoin des trois clés mentionné dans ce message sinon requestAlwaysAuthorization() et locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) échoueront en silence.

Plan montrant la traduction allemande à titre d'exemple:

enter image description here

J'espère que cela vous fait gagner du temps en tombant sur.

20
iDoc

Travailler dans Swift 4.0.

   <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
   <string>Description</string>

   <key>NSLocationAlwaysUsageDescription</key>
   <string>Will you allow this app to always know your location?</string>

   <key>NSLocationWhenInUseUsageDescription</key>
   <string>Do you allow this app to know your current location?</string>  
16
Keshav Gera

Suivez ces étapes:

J'ai rencontré le même problème avec une application nécessitant "Toujours l'autorisation" et je l'ai résolu en procédant comme suit:

1. Ajoutez la touche NSLocationWhenInUseUsageDescription à Info.plist

2. Ajoutez NSLocationAlwaysAndWhenInUseUsageDescription à Info.plist

3. Ajoutez NSLocationAlwaysUsageDescription à Info.plist (pour supporter <iOS 11)

4. Appeler requestWhenInUseAuthorization()AVANTrequestAlwaysAuthorization()

Vous ne pouvez pas exécuter requestAlwaysAuthorization () avant requestWhenInUseAuthorization (). Vous devez accéder à ce niveau d'autorisation. Une fois ces modifications effectuées, les mises à jour de localisation ont à nouveau fonctionné correctement.

Plus de détails ici:

https://developer.Apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization

11
mhit0

Mieux vaut prévenir que guérir .. Sous iOS 11: Ajoutez ce qui suit et vous êtes bon.

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
6
Abhishek Bedi

Swift: J'ai fait face au même problème. J'étais totalement foutu de trouver la solution. voici comment j'ai résolu le problème.

step-1: Fichier de projet> Capacités> Modes d’arrière-plan> sélectionnez mise à jour de la localisation

étape-2: Ajouter les clés NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription à Info.plist

étape 3:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
2
Santosh Sahoo

Testé sur iOS 12.2 avec Swift 5

Étape 1. Vous devez ajouter les autorisations de confidentialité suivantes dans le fichier plist.

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires user’s location for better user experience.</string>

Étape 2. Assurez-vous de suivre le code Swift pour obtenir les emplacements actuels.

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    // MARK: Variables declearations
    @IBOutlet weak var mapView: MKMapView!
    var locationManager: CLLocationManager!

    // MARK: View Controller life cycle methods
    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO: Make user you must add following three privacy permissions in plist
        //NSLocationWhenInUseUsageDescription
        //NSLocationAlwaysAndWhenInUseUsageDescription
        //NSLocationAlwaysUsageDescription

        getCurrentLocation()
    }

    func getCurrentLocation()
    {
        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    // MARK: Location Manager Delegate methods
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let locationsObj = locations.last! as CLLocation
        print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
        showOnMap(location: locationsObj)
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Get Location failed")
    }

    func showOnMap(location: CLLocation )
    {
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        mapView.setRegion(region, animated: true)
    }
}
0
swiftBoy