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 maintenant, j'ai copié mon projet à partir de ma base iOS 7 pour inclure de nouvelles fonctionnalités. Mais lorsque je fais les modifications pour la confidentialité de l'emplacement iOS8, le Popup n'apparaît plus.
Mon code a fonctionné jusqu'à ce que je copie.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>tolle sache </string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
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?
De la documentation
NSLocationWhenInUseUsageDescription (String - iOS) décrit la raison pour laquelle l’application accède normalement à l’emplacement de l’utilisateur lorsqu’elle s’exécute au premier plan. Incluez cette clé lorsque votre application utilise les services de localisation pour suivre directement la position actuelle de l'utilisateur. Cette clé ne prend pas en charge l’utilisation de services de localisation pour surveiller des régions ou la localisation de l’utilisateur à l’aide du service de changement de localisation 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 requise 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 à la fois 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’ajouter cette clé à votre info.plist est de cliquer avec le bouton droit de la souris sur info.plist et de choisir
Ouvrir en tant que> Code source
puis ajoutez ce qui suit à la fin avant </dict></plist>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
Si vous le souhaitez, vous pouvez ajouter un texte entre <string></string>
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 une description 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 à ajouter à propos de ma récente implication dans CLLocationManager.
1) Les clés suivantes doivent être entrées dans votre fichier * .plist:
Les clés les plus couramment utilisées ont des noms génériques plus descriptifs, tels que "Confidentialité - Description d'utilisation de l'emplacement", qui est en réalité la clé "NSLocationUsageDescription".
Pour voir les noms de clés "brutes", accédez à "* -Info.plist" et cliquez avec le bouton droit de la souris sur la zone du navigateur dans laquelle les clés sont répertoriées.
Et vous obtenez les résultats suivants:
Les trois clés liées à cet article sont:
2) Assurez-vous d'allouer et d'initialiser votre implémentation de CLLocationManager avant de tenter de demander une autorisation ou de mettre à jour l'emplacement.
fichier * .h:
@interface SomeController : UIViewController <CLLocationManagerDelegate>
@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 fait gagner du temps à quelqu'un! Merci.
Voici un petit casse-tête. Assurez-vous que vous ajoutez les clés NSLocationAlwaysUsageDescription ou NSLocationWhenInUseUsageDescription au plist de bundle principal et non à l'un de vos plists de cible de test!
Si le même problème était dû au fait que j’instanciais CLLocationManager
dans une variable locale dans une méthode, l’avait résolu en faisant de CLLocationManager
une propriété de classe.
Après un certain temps, j’ai trouvé la solution, mais je la laisse ici car c’est le premier résultat obtenu sur Google. J'espère vous faire gagner un peu de temps:
Relatif à la Apple Regardez:
Vous devez mettre la clé requestWhenInUseAuthorization
dans le Info.plist
De l'iPhone, pas dans l'application WatchKit.
Cela m'a mordu deux fois maintenant.