web-dev-qa-db-fra.com

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

49
Marcus

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.

101
Groot

Essayez d’écrire une description NSLocationWhenInUseUsageDescription dans Info.plist.

19
Masatsugu Hosoi

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:

enter image description here

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.

enter image description here

Et vous obtenez les résultats suivants:

enter image description here

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

enter image description here

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.

10
serge-k

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!

3
smileBot

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:

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

1
Mark E

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.

0
HenryRootTwo