Question Pourquoi mon délégué CLLocationmanager n'est-il pas appelé?


Je ne reçois aucun rappel de localisation sur sim ou sur le périphérique. J'ai ce code appelé:

- (void)startLocationCallbacks: (NSObject*) ignore
{
  locationManager.delegate = self;
  locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
  locationManager.distanceFilter = MINIMUM_METERS;

  [locationManager startUpdatingLocation];
  NSLog(@"[DEBUG] [locationManager startUpdatingLocation] (%@, %@)", locationManager, locationManager.delegate);
}

et enregistrer les relevés en haut des deux

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

et

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

mais aucune instruction de journal n'est jamais appelée. Les notifications d'emplacement sont activées pour mon application (comme indiqué dans Paramètres, plus je l'ai dit "autoriser").

Quelles sont les raisons possibles pour lesquelles je ne reçois pas de mises à jour de localisation?

Config / autres infos:

  • J'ai alloué locationManager et l'ai enregistré dans une propriété conservée.
  • J'ai appelé startUpdatingLocation
  • J'utilise le SDK 4.1
  • Le problème concerne à la fois Sim et iPod-touch (2e génération) et iPhone-3, tous fonctionnant en 4.1
  • Les notifications d'emplacement sont permis dans mon application (les deux comme indiqué dans les paramètres et parce que j'ai cliqué sur "autoriser" dans l'alerte.)
  • J'ai déjà utilisé CLLocationManager avec succès (dans de nombreuses applications de livraison!). C'est un vrai casse-tête pour moi.

Merci!


20
2017-09-17 00:24


origine


Réponses:


Ouf! Ok, je l'ai trouvé

Il s’avère que l’un des moyens de faire CLLocationManager pas déclencher des rappels de localisation est de faire toute la configuration dans pas-le-thread principal. Quand j'ai déplacé ma routine d'installation vers un performSelectorOnMainThread, tout fonctionnait exactement comme prévu.

Quel cauchemard!

J'espère que cette réponse aidera les autres ...

Modification / clarification:

A l'origine, j'avais quelque chose comme ça:

- (BOOL) appDidFinishLaunchingWithOptions: (NSDictionary*) options
{
     // ...[app setup, snip]
    [NSThread detachNewThreadSelector: @selector(postLaunchSetupThread) toTarget: self withObject: nil];
}

- (void)postLaunchSetupThread
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    // ...[other setup, snip]
    [self setupLocationManager];
    [pool release];
}

- (void)setupLocationManager
{
     self.myLocationManager = [[[CLLocationManager alloc] init] autorelease];
     [myLocationManager startLocationUpdates];
}

Mais appeler setupLocationManager dans un thread empêché les rappels. Donc ma solution était de déplacer la ligne

[self setupLocationManager];

hors du fil et dans appDidFinishLaunchingWithOptions


47
2017-09-17 05:48



En fait, vous pouvez également l'exécuter à partir d'un autre thread. De la documentation Apple:

La configuration de l'objet de votre gestionnaire de localisation doit toujours avoir lieu sur un   thread avec une boucle d'exécution active, telle que la principale de votre application   fil.

Assurez-vous simplement que votre boucle d'exécution est exécutée sur ce thread et que les événements CLLocationManager sont distribués. En savoir plus sur la boucle d'exécution: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html


15
2018-02-11 01:58



Pour iOS 8

1) J'ai placé ces lignes juste après avoir initié le gestionnaire de localisation.

if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

2) J'ai ajouté NSLocationAlwaysUsageDescription au plist et l'a défini sur une chaîne et ajouté un message. 3) Dans ma cible, j'ai cliqué sur l'onglet Capabilities, puis activé les modes d'arrière-plan et vérifié "Mises à jour d'emplacement" et "Utilise les accessoires Bluetooth LE"

Cela a fonctionné pour moi


1
2018-01-22 12:54



// Regarde ça   //...CLLocationManager n'appelle pas correctement la méthode delegate

//...après beaucoup de R & D j'utilise une méthode de surveillance qu'il appelle "

https://stackoverflow.com/questions/7156920/didupdatetolocation-doesnt-gets-called-immediately/14605889#14605889


0
2018-01-30 14:09



Dans mon cas, c'était parce que mon appareil était incapable de déterminer l'emplacement - tandis que rester à l'intérieur du signal GPS n'était pas disponible et le Wi-Fi était également déconnecté afin que le gestionnaire de localisation ne soit pas en mesure de recevoir des données de localisation et délégué n'a jamais été appelé.

Une fois que j'ai connecté le wi-fi, ça a fonctionné (je suppose que sortir en plein air devrait aussi faire l'affaire dans ce cas, mais parfois ce n'est pas très pratique :))


0
2018-03-22 09:57