web-dev-qa-db-fra.com

CLLocationManager startUpdatingLocation n'appelle pas locationManager: didUpdateLocations: ou locationManager: didFailWithError:

J'essaie d'utiliser le framework CLLocationManager dans mon projet iOS pour accéder à l'emplacement de l'utilisateur, mais lorsque j'appelle 

[locationManager startUpdatingLocation]

ni locationManager:didUpdateLocations: ni locationManager:didFailWithError: ne sont appelés.

//myViewController.h
@interface myViewController : UITableViewController <CLLocationManagerDelegate>
@end

//myViewController.m
@implementation myViewController{
    CLLocationManager *locationManager;
}

//edit
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
}
//finish edit

-(void)getLocation
{
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
UIAlertView *errorAlert = [[UIAlertView alloc]
                           initWithTitle:@"Error" 
                                 message:@"Failed to Get Your Location"              
                                delegate:nil 
                       cancelButtonTitle:@"OK" 
                      otherButtonTitles:nil];
[errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *newLocation = locations[[locations count] -1];
    CLLocation *currentLocation = newLocation;
    NSString *longitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
    NSString *latitude = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];

if (currentLocation != nil) {
   NSLog(@"latitude: %@", latitude);
   NSLog(@"longitude: @"%@", longitude);
}else {
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" 
                                                     delegate:nil 
                                            cancelButtonTitle:@"OK" 
                                            otherButtonTitles:nil];
    [errorAlert show];
}

}
@end

Aucune méthode de délégué n’est appelée malgré ce qu’elle indique dans la documentation: 

"Cette méthode retourne immédiatement. L'appel de cette méthode amène le gestionnaire d'emplacement à obtenir un correctif d'emplacement initial (qui peut prendre plusieurs secondes) et à avertir votre délégué en appelant sa méthode locationManager:didUpdateLocations: [...] En plus de votre objet délégué implémentant la méthode locationManager:didUpdateLocations: , il devrait également implémenter la méthode locationManager:didFailWithError: pour répondre aux erreurs potentielles. "

Je ne sais pas comment résoudre le problème.

Merci,

JA

36
ja.

enter image description hereAjoutez simplement ceci dans info.plist

NSLocationAlwaysUsageDescription --- J'ai besoin d'emplacement

NSLocationWhenInUseUsageDescription --- J'ai besoin d'emplacement 

confidentialité - description de l'utilisation de l'emplacement --- j'ai besoin de l'emplacement

  locationManager = [[CLLocationManager alloc] init];
  locationManager.delegate=self;
  locationManager.desiredAccuracy=kCLLocationAccuracyBest;
  locationManager.distanceFilter=kCLDistanceFilterNone;
  [locationManager requestWhenInUseAuthorization];
  [locationManager startMonitoringSignificantLocationChanges];
  [locationManager startUpdatingLocation];

Maintenant, il appellera votre didUpdateToLocation définitivement. 

pour plus de détails cliquez ici

89
Mohit tomar

Les services de localisation fonctionnent un peu différemment à partir de iOS 8.

Vous devez principalement ajouter une clé NSLocationWhenInUseUsageDescription à votre fichier Info.plist, ainsi qu'une description des raisons pour lesquelles votre application a besoin d'emplacement, par exemple "Emplacement requis pour ...".

Notez que vous devrez peut-être également vérifier la version iOS. Seul le gestionnaire d'emplacements iOS 8 et versions ultérieures écoute l'appel requestWhenInUseAuthorization.

Le lien ci-dessous montre plus de détails: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Bonne chance!

13
Emilio Barcelos

Vous devez absolument vérifier que vous initialisez CLLocationManager sur le thread principal . Dans le cas contraire, vous ne recevrez pas l'événement updateLocation.

Je ne trouve pas cette information dans la documentation Apple, mais cela fonctionne quand même.

10
malex

Avec iOS 8.0, vous devez d'abord appeler -[CLLocationManager requestWhenInUseAuthorization ] ou -[CLLocationManager requestAlwaysAuthorization] pour que l'utilisateur soit invité à donner à votre application la permission d'utiliser l'emplacement.

5
orkoden

Vous devez ajouter ci-dessous des éléments à votre projet,

  1. En plus de votre projet, ajoutez ces choses:

    1. Key: NSLocationAlwaysUsageDescription Type:String
    2. Key: NSLocationWhenInUseUsageDescription Type:String
  2. Dans le fichier .m avec [locationManager startUpdatingLocation], ajoutez cette condition:

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
         [locationManager requestAlwaysAuthorization];`
    

Dans ce cas, seules vos méthodes de délégué CLLocationManager seront appelées.

4
Bhavin Trivedi

Je pense que vous devriez vérifier ce lien.Vous ne conservez pas l'objet de gestionnaire d'emplacement lors de la déclaration.

donnez s'il vous plaît une propriété à votre objet @ propriété (nonatomique, fort)

Pourquoi le délégué CLLocationManager n'est pas appelé dans iPhone SDK 4.0?

1
Dheeraj Kumar

J'ai eu le suivant dans ma base de code:

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if( status == kCLAuthorizationStatusAuthorizedAlways ) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        _locationManager.distanceFilter = 200;
    }
}

Il s'avère que cela a été appelé dans une boucle infinie, car l'initialisation d'un locationManager déclenche cette méthode pour une raison quelconque? Je n'avais pas compris cela. Je l'avais mis là pour attraper quand les autorisations ont été accordées. Au lieu de cela, j'ai mis en place un gestionnaire d'emplacement et commencé à mettre à jour l'emplacement, mais cela a été renvoyé et remplacé par un autre qui ne mettait pas à jour l'emplacement, et j'ai gardé en boucle.

La solution pour moi consistait simplement à ajouter && !_locationManager à la condition if.

0
Jake T.