2015-03-09 2 views
2

J'essaie d'utiliser l'emplacement de l'utilisateur sur mon application iOS. L'application fonctionne sur iOS 7 mais pas sur iOS 8.iOS 8.1 CoreLocationManager requestWhenInUseAuthorization n'invite pas AlertView

J'ai tout essayé. Lisez un tas de tutoriels et je sais que dans l'iOS 8, nous devons appeler la méthode requestWhenInUseAuthorization et ajouter la clé NSLocationWhenInUseUsageDescription dans Info.plist.

Mais cela ne fonctionne toujours pas, il ne demande pas la permission de l'utilisateur, je suis en train de tester dans un vrai appareil (un iPhone 5c sous iOS 8.1.x). J'ai essayé de réinstaller l'application plusieurs fois.

Ce sont les codes d'un très très très petit projet que j'ai créé pour tester cette chose.

Mon ViewController.m

#import "ViewController.h" 

#import <CoreLocation/CoreLocation.h> 

@interface ViewController() <CLLocationManagerDelegate> 

@property (strong, nonatomic) CLLocationManager *locationManager; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    self.locationManager.distanceFilter = kCLHeadingFilterNone; 

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
     NSLog(@"Pôde chamar o método"); // It could call the method 
     [self.locationManager requestWhenInUseAuthorization]; 
    } 

// [self.locationManager startUpdatingLocation]; 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - CLLocationManagerDelegate 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    NSLog(@"Atualizou Localização para: %@", [locations lastObject]); // Updated the location to 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    NSLog(@"Location Manager falhou com erro: %@", error); // Location manager failed with error 
} 

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    if (status == kCLAuthorizationStatusAuthorized) { 
     [self.locationManager startUpdatingLocation]; 
    } 
} 

@end 

Mon Info.plist

<?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>CFBundleDevelopmentRegion</key> 
    <string>en</string> 
    <key>CFBundleExecutable</key> 
    <string>$(EXECUTABLE_NAME)</string> 
    <key>CFBundleIdentifier</key> 
    <string>wallace.$(PRODUCT_NAME:rfc1034identifier)</string> 
    <key>CFBundleInfoDictionaryVersion</key> 
    <string>6.0</string> 
    <key>CFBundleName</key> 
    <string>$(PRODUCT_NAME)</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> 

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


</dict> 
</plist> 

Quelqu'un sait comment comprendre cela?

+0

Juste pour confirmer, est-ce qu'il entre dans l'instruction 'if' où vous demandez une autorisation et enregistre le" Pôde chamar o método "? Et quand vous dites "ça ne marche pas", voulez-vous dire qu'il ne demande jamais d'autorisation? Ou il ne suit pas l'emplacement correctement? Si cela ne vous est pas proposé, vérifiez votre application de configuration pour vous assurer qu'elle n'est pas déjà autorisée et que les services de localisation sont activés. – Stonz2

+0

L'instruction if est satisfaite. Avec "ne fonctionne pas", je veux dire qu'il ne lance pas la permission de l'utilisateur demandant AlertView. Et la méthode locationManager: didChangeAuthorizationStatus: est appelée une fois avec la valeur d'état kCLAuthorizationStatusNotDetermined – Wallace

+0

Envisagez d'ajouter une valeur de chaîne à 'NSLocationWhenInUseUsageDescription' dans votre requête. Je pense que vous devez fournir du texte que l'utilisateur verra lorsque l'alerte est affichée. – Stonz2

Répondre

1

Ajoutez NSLocationAlwaysUsageDescription et NSLocationWhenInUseUsageDescription à Info.plist. Vous pouvez ensuite indiquer le texte AlertView pour chacune de ces valeurs.

Le gestionnaire d'emplacement examinera le texte de ces champs pour les afficher dans AlertView.

+1

NSLocationAlwaysUsageDescription ** ou ** NSLocationWhenInUseUsageDescription. – Stonz2

+0

Ouais, ils ne sont pas tous les deux obligatoires mais je les inclue généralement tous les deux de toute façon. – aahrens

+0

Il est inclus. Voir la fin de mon Info.plist: NSLocationWhenInUseUsageDescription Et j'ai essayé d'ajouter les deux valeurs clés. – Wallace

1

Ajouter ce qui suit à l'locationManager:didChangeAuthorizationStatus:

if (status == kCLAuthorizationStatusNotDetermined) { 
    [manager requestAlwaysAuthorization]; 
} 
-1

Je ne sais pas pourquoi, mais pour une raison quelconque, ajoutant NSLocationWhenInUseUsageDescription à info.plist et appelant requestWhenInUseAuthorization ne fonctionnait pas pour moi, après plusieurs essais, je trouve ci-dessous solution . Wired mais a travaillé pour moi.

d'abord ajouter les NSLocationWhenInUseUsageDescription et NSLocationAlwaysUsageDescription clés dans info.plist et appeler les deux méthodes requestAlwaysAuthorization et requestWhenInUseAuthorization. Maintenant, vous devriez recevoir une notification. Une fois que vous avez reçu la notification, vous pouvez supprimer le code inutile et les éléments info.plist.

Cela a fonctionné après plusieurs essais, j'espère que cela aide au moins pour quelques personnes.