iOS 8 requestWhenInUseAuthorization no Popup

J’ai essayé de préparer mon AppProject iOS 8. J’avais beaucoup lu sur

[_locationManager requestWhenInUseAuthorization]; 

et l’entrée en plist

 NSLocationWhenInUseUsageDescription 

J’ai donc changé toutes les lignes de code nécessaires.

Cela fonctionne bien, mais j’ai maintenant recopié mon projet depuis ma base iOS 7 pour inclure de nouvelles fonctionnalités. Mais lorsque j’apporte les modifications pour iOS8 Location Privacy, le Popup n’apparaît plus.

Mon code a fonctionné jusqu’à ce que je copie.

     NSLocationWhenInUseUsageDescription tolle sache  CFBundleDevelopmentRegion en CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier fapporite.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType BNDL CFBundleShortVersionSsortingng 1.0 CFBundleSignature ???? CFBundleVersion 1   

et voici mon appel

 - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { _UserLocation = [[CLLocation alloc]init]; _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager _locationManager.delegate = self; _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST [_locationManager startUpdatingLocation]; //requesting location updates NSLog(@"passed initwithcode"); } return self; } 

Comment puis-je réparer cela?

À partir de la documentation

NSLocationWhenInUseUsageDescription (Ssortingng – iOS) décrit la raison pour laquelle l’application accède normalement à l’emplacement de l’utilisateur lors de l’exécution au premier plan. Incluez cette clé lorsque votre application utilise les services de localisation pour suivre directement l’emplacement actuel de l’utilisateur. Cette clé ne prend pas en charge l’utilisation des services de localisation pour surveiller les régions ou surveiller l’emplacement de l’utilisateur à l’aide du service de modification d’emplacement significatif. Le système inclut la valeur de cette clé dans le panneau d’alerte affiché à l’utilisateur lorsqu’il demande l’autorisation d’utiliser les services de localisation.

Cette clé est requirejse lorsque vous utilisez la méthode requestWhenInUseAuthorization de la classe CLLocationManager pour demander une autorisation pour les services de localisation. Si la clé n’est pas présente lorsque vous appelez la méthode requestWhenInUseAuthorization sans inclure cette clé, le système ignore votre demande.

Cette clé est prise en charge dans iOS 8.0 et versions ultérieures. Si votre fichier Info.plist inclut cette clé et la clé NSLocationUsageDescription, le système utilise cette clé et ignore la clé NSLocationUsageDescription.

Lisez à ce sujet ici .

Je trouve que le moyen le plus simple d’append cette clé à votre info.plist est de cliquer avec le bouton droit de la souris sur info.plist et de choisir

Open As-> Code source

puis ajoutez les éléments suivants à la fin avant

 NSLocationWhenInUseUsageDescription  

Si vous le souhaitez, vous pouvez append un texte entre qui décrit à l’utilisateur la raison pour laquelle vous souhaitez utiliser son emplacement. Ce texte apparaîtra sous le texte par défaut dans l’alerte.

Essayez d’écrire un NSLocationWhenInUseUsageDescription dans Info.plist

iOS 8.3, Xcode 6.3.1, ARC activé

La question a été résolue, mais j’ai (2) des notes à append à partir de mon implication récente avec CLLocationManager.

1) Vous devez avoir les clés suivantes entrées dans votre fichier * .plist:

entrer la description de l'image ici

Les clés les plus couramment utilisées ont des noms plus descriptifs, tels que “Privacy – Location Usage Description”, qui est en réalité la clé “NSLocationUsageDescription”.

Pour voir les noms de clé “bruts”, allez à “* -Info.plist” et cliquez avec le bouton droit de la souris dans la zone du navigateur où les clés sont listées, voir ci-dessous:

entrer la description de l'image ici

Et vous obtenez les résultats suivants:

entrer la description de l'image ici

Les trois clés liées à cet article sont:

entrer la description de l'image ici

2) Assurez-vous d’allouer et d’initialiser votre implémentation de CLLocationManager avant d’essayer de demander une autorisation ou de mettre à jour l’emplacement.

* fichier .h:

 @interface SomeController : UIViewController  @property (strong, nonatomic) CLLocationManager *locationManager; 

fichier * .m:

 - (IBAction)locationButton:(UIButton *)sender { if (self.locationManager == nil) { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; } else { nil; } if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { [self.locationManager requestWhenInUseAuthorization]; } else { nil; } self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; [self.locationManager startUpdatingLocation]; } 

J’espère que cela fera gagner du temps à quelqu’un! Merci.

Voici un petit truc. Assurez-vous d’append les clés NSLocationAlwaysUsageDescription ou NSLocationWhenInUseUsageDescription au plist du bundle principal et non à l’une de vos listes de cibles de test!

Si le même problème avait été causé par l’instanciation de CLLocationManager dans une CLLocationManager locale au sein d’une méthode, le problème était résolu, faisant de CLLocationManager une propriété de classe.
Après un certain temps j’ai trouvé la solution ici, mais je le laisse ici car c’est le premier résultat de google, j’espère vous faire gagner du temps:

requestWhenInUseAuthorization () ne fonctionne pas dans iOS 8 avec NSLocationWhenInUseUsageDescription Clé dans Info.plist

Relatif à Apple Watch:

Vous devez mettre la clé requestWhenInUseAuthorization dans requestWhenInUseAuthorization de l’iPhone, pas dans l’application WatchKit.

Cela m’a mordu deux fois maintenant.