web-dev-qa-db-fra.com

- Erreur [CLLocationManager requestWhenInUseAuthorization] ou - [CLLocationManager requestAlwaysAuthorization]

Voici mon code, affichant à la fois l'alerte et le point bleu de la position actuelle sur la carte:

MapName.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>


@interface MapName : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>

@property (strong, nonatomic) IBOutlet MKMapView *MapName;
@property (strong, nonatomic) CLLocationManager *locationManager;

@end

MapName.m

- (void)viewDidLoad
{
[super viewDidLoad];

self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.delegate = self;
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

//Center the map
[self gotoLocation];

//Show current position
_MapName.showsUserLocation = YES;

}

J'ai ajouté la clé NSLocationWhenIsUseUsageDescription sous forme de chaîne à Info.plist . Je reçois toujours la même erreur sur Xcode.

12
Max1980

C'est dû à la fois:

[self.locationManager startUpdatingLocation];

et

_MapName.showsUserLocation = YES;

Vous devez vérifier si l'utilisateur a donné l'autorisation avant de les appeler. Assurez-vous également de désactiver l'emplacement de l'utilisateur dans le MKMapKit sur le storyboard (celui-ci m'a pris plusieurs jours).

Faites quelque chose comme:

CLAuthorizationStatus authorizationStatus= [CLLocationManager authorizationStatus];

if (authorizationStatus == kCLAuthorizationStatusAuthorized ||
    authorizationStatus == kCLAuthorizationStatusAuthorizedAlways ||
    authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) {

    [self.locationManager startUpdatingLocation];       
    _MapName.showsUserLocation = YES;        

}

En fonction de votre application, vous pouvez ne pas souhaiter demander l'autorisation de l'utilisateur au lancement, car cela n'est pas recommandé.

15
Romeithius

Le message d'erreur est plutôt littéral. N'appelez pas [self.locationManager startUpdatingLocation] tant que vous n'avez pas l'autorisation. Votre [self.locationManager requestWhenInUseAuthorization], selon la documentation, est asynchrone. 

Lorsque le statut d'autorisation actuel est kCLAuthorizationStatusNotDetermined, cette méthode s'exécute de manière asynchrone et invite l'utilisateur à accorder l'autorisation à l'application d'utiliser les services de localisation. 

Cela signifie que vous demandez à la fois un accès et que vous démarrez votre analyse en même temps. 

Au lieu de cela, essayez d’implémenter -[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:] et de lancer votre analyse à partir du moment où il aura été déterminé que vous disposez d’une autorisation. 

4
incanus

Sur Swift: 

  let locationManager: CLLocationManager = CLLocationManager()
  let authorizationStatus = CLLocationManager.authorizationStatus()


  override func viewDidLoad() {
    super.viewDidLoad()
    if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
       locationManager.startUpdatingLocation()
    }
    else
    {
      locationManager.requestWhenInUseAuthorization()
    }
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters

}

N'oubliez pas d'ajouter dans le fichier Info.plist ces clés:

 enter image description here

3
A.G

Le mot clé dans le fichier d'information est ("In" au lieu de "Is"):

NSLocationWhenInUseUsageDescription
1
Peter Pei Guo

Sur la base de la réponse de Jérôme, j'ai traduit la réponse qui fonctionnait pour moi en Swift.

    let authorizationStatus = CLLocationManager.authorizationStatus()

    if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) {
           self.findMyLocation()
    }

Remarque: d'après ce que j'ai lu dans les documents, il n'y a pas d'équivalent kCLAuthorizationStatusAuthorized dans Swift.

0
jason328

Cette façon fonctionne sans erreurs sur Xcode6:

AppDelegate.h

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) UIWindow *window;

@end 

AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize locationManager = _locationManager;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary     *)launchOptions
 {
//Current position
    self.locationManager = [[CLLocationManager alloc] init];
    [self.locationManager requestWhenInUseAuthorization];

return YES;
}
@end

Le message d'alerte s'affiche lorsque vous ouvrez l'application pour la première fois.

0
Max1980