CLLocationManager startUpdatingLocation ne pas appeler locationManager:didUpdateLocations: ou locationManager:didFailWithError:

j'essaie d'utiliser le cadre CLLocationManager dans mon projet iOS pour accéder à l'emplacement de l'utilisateur mais quand j'appelle

[locationManager startUpdatingLocation]

ni locationManager:didUpdateLocations: ni locationManager:didFailWithError: 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

ni l'une ni l'autre méthode de délégué n'est appelée en dépit de ce qu'il dit dans la documentation:

" cette méthode est appliquée immédiatement. Appeler cette méthode amène le gestionnaire d'emplacement à obtenir un repère d'emplacement initial (ce qui peut prendre plusieurs secondes) et aviser votre délégué en appelant sa méthode locationManager:didUpdateLocations: [...] En plus de votre objet délégué mettant en œuvre la méthode locationManager:didUpdateLocations: , il devrait également mettre en œuvre la méthode locationManager:didFailWithError: pour répondre aux erreurs potentielles."

ne sait pas comment déboguer le problème.

Merci,

JA

36
demandé sur Mihir Oza 2014-09-18 19:32:11

7 réponses

enter image description here il suffit d'ajouter ceci dans info.plist

NSLocationAlwaysUsageDescription --- j'ai besoin d'Emplacement

Nlocationlorsqu'Iln'Estpasusagedescription - - - I need Location

vie privée - lieu d'utilisation de la description --- j'ai besoin d'Emplacement

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

maintenant il va appeler votre didUpdateToLocation certainement.

pour plus de détails Cliquez ici

90
répondu Mohit tomar 2015-02-25 12:34:48

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

Principalement, vous devez ajouter une clé NSLocationWhenInUseUsageDescription à votre Info.plist fichier, et ajouter une description pourquoi votre application besoin emplacement, comme "emplacement nécessaire à ...".

notez que vous pourriez aussi avoir à vérifier la version iOS. Seulement iOS 8 et plus ont le Gestionnaire d'emplacement écouter l'appel requestWhenInUseAuthorization .

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

bonne chance!

13
répondu Emilio Barcelos 2014-10-13 16:52:48

vous devez absolument vérifier que vous initialisez CLLocationManager sur le thread principal. Dans les autres cas, vous n'obtiendrez pas l'événement updateLocation.

Je ne peux pas trouver de telles informations dans Apple docs, mais ça marche pour moi de toute façon.

9
répondu malex 2016-04-20 16:31:16

Avec iOS 8.0, vous devez appeler les -[CLLocationManager requestWhenInUseAuthorization ] ou -[CLLocationManager requestAlwaysAuthorization] d'abord afin que l'utilisateur obtient demandé de donner votre application l'autorisation d'utiliser l'emplacement.

5
répondu orkoden 2014-09-18 15:52:04

Vous devez ajouter les choses ci-dessous à votre projet,

  1. dans la liste de votre projet ajouter ces choses:

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

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

alors seulement vos méthodes de délégué CLLocationManager obtiendront appelé.

4
répondu Bhavin Trivedi 2016-05-12 06:41:41

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

veuillez donner des biens en objet @property(nonatomic, fort)

pourquoi le délégué de CLLocationManager ne se fait-il pas appeler en iPhone SDK 4.0?

1
répondu Dheeraj Kumar 2017-05-23 12:26:05

j'ai eu ce qui suit 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;
    }
}

S'avère que cela a été appelé dans une boucle infinie, parce que l'initialisation d'un locationManager déclenche cette méthode pour une raison quelconque? Je n'avais pas réalisé que. Je l'avais mis là pour la capture des autorisations ont été accordées. Au lieu de cela, j'ai mis en place un gestionnaire d'emplacement et j'ai commencé à mettre à jour l'emplacement, mais ensuite cela s'est déclenché et l'a remplacé par un qui n'était pas la mise à jour de l'emplacement, et a continué à Boucler encore et encore.

la Solution pour moi était juste d'ajouter && !_locationManager à la condition if.

0
répondu Jake T. 2018-04-04 16:15:18