89 votes

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 les blue banner qui apparaissent toujours. J'ai pensé - "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?

157voto

William George Points 1659

Il semblerait qu'apple a ajouté encore une autre fonction de confidentialité. L'utilisateur est maintenant en mesure de remplacer notre requestAlwaysAuthorization et de rétrograder à requestWhenInUseAuthorization - ce Qui signifie que tant que développeur, nous avons maintenant de fournir à la fois des descriptions dans l' Info.plist

J'ai constaté que 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 fonctionne toujours pas, après recherche j'ai trouvé ce petit bijou mixte avec toutes les informations de débogage supplémentaires:

Cette application a tenté d'accéder à la confidentialité des données sensibles sans une description de l'utilisation. L'application Info.plist doit contenir à la fois NSLocationAlwaysAndWhenInUseUsagedescription et NSLocationWhenInUseUsageDescription touches avec les valeurs de chaîne expliquant à l'utilisateur comment l'application utilise ces données

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

Bonne nouvelle, si vous suivez les conseils de la console de débogage, c'est à dire. ajouter la nouvelle clé NSLocationAlwaysAndWhenInUseUsageDescription et l'une des clés anciennes NSLocationWhenInUseUsageDescription, les services de localisations vont commencer à travailler à nouveau.

46voto

Heider Sati Points 76

Juste pour ajouter les étapes sur la fixation de ce:

2 façons de le faire:

A) la voie de La facilité: Sélectionnez votre Info.fichier plist, ajouter des propriétés, de la remarque qu'ils commencent avec PRIVCY au lieu de EMPLACEMENT... donc, le nom exact de ces variables commence par "vie privée - Emplacement ..." etc, ajouter tous ici, et décrire la façon dont l'utilisateur serait de voir cela sur l'avertissement.

B) La dur / intéressant / programatic façon (j'aime cette façon de plus):

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

Suivez les autres ...... format, et ajouter 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>

Enregistrer, puis cliquez-droit sur l'info.fichier plist, puis sélectionnez liste de propriétés, ce qui devrait afficher le fichier dans la vue par défaut.

EDIT:

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

1) Sur votre .H de fichiers, d'ajouter:

@property (strong, nonatomic) CLLocationManager *LocationManager;

2) Sur votre .M fichier ajouter sous ViewDidAppear() fonction:

_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];

Cette ce qui fonctionne bien pour moi, j'espère que le code devrait fonctionner pour vous aussi.

Ce qui concerne

Heider

23voto

iDoc Points 385

travaillant sous iOS11 j'ai découvert cette Info.plist besoins coll moins NSLocationAlwaysAndWhenInUseUsagedescription en Info.plist:

enter image description here

Assez étrange lorsque votre application est multilingue, les versions localisées de vos chaînes besoin tous les trois clés mentionnés dans ce post, le reste requestAlwaysAuthorization() et locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) échoue silencieusement.

Plan montrant la traduction en allemand comme par exemple:

enter image description here

Espérons que cela vous fait gagner du temps lorsqu'ils tombent sur.

17voto

Keshav Gera Points 1892

Travailler dans Swift 4.0.3

    <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>  
 

16voto

mhit0 Points 141

Suivez ces étapes:

J'ai rencontré le même problème avec une application que nécessaire "Toujours d'Autorisation", et résolu en suivant ces étapes:

1. Ajouter NSLocationWhenInUseUsageDescription clé de l' Info.plist

2. Ajouter NSLocationAlwaysAndWhenInUseUsageDescription de Info.plist

3. Ajouter NSLocationAlwaysUsageDescription de Info.plist (à l'appui de < iOS 11)

4. Appelez requestWhenInUseAuthorization() AVANT requestAlwaysAuthorization()

Vous ne pouvez pas exécuter requestAlwaysAuthorization() avant requestWhenInUseAuthorization(). Vous devez remonter à ce niveau d'autorisation. Une fois que j'ai fait ces changements, l'emplacement des mises à jour a commencé à travailler à nouveau correctement.

Plus de détails peuvent être trouvés ici:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X