Région surveillant l'location actuel ne notifie pas à la sortie

J'essaie de tester la surveillance de la région, pour cela, je reçois l'location actuel comme ceci:

- (void)startLocationTracking { CLLocationManager *locationManager = [[CLLocationManager alloc] init]; // Start location manager if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { locationManager = [LocationTracker sharedLocationManager]; locationManager.delegate = self; [locationManager startMonitoringSignificantLocationChanges]; } } 

Et suivi du premier location avec la surveillance de la région comme ceci:

 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:manager.location.coordinate radius:300 identifier:@"first location initializer"]; NSLog(@"0: %@", manager.location); NSLog(@"1: %@", region); [manager startMonitoringForRegion:region]; NSLog(@"[locationManager startMonitoringForRegion:%@];", region); }); } 

Ensuite, à chaque sortie de la région actuelle, je surveille le nouvel location comme ceci:

 - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { NSLog(@"%s, %@", __PRETTY_FUNCTION__, region); } - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { NSLog(@"%s, %@", __PRETTY_FUNCTION__, region); NSArray *allRegions = manager.monitoredRegions.allObjects; if (allRegions.count > 0) { for (CLRegion *reg in allRegions) { [manager stopMonitoringForRegion:reg]; } } CLLocationCoordinate2D cord = CLLocationCoordinate2DMake(manager.location.coordinate.latitude, manager.location.coordinate.longitude); CLRegion *regionNew = [[CLRegion alloc] initCircularRegionWithCenter:cord radius:300 identifier:@"new region"]; NSLog(@"region: %@", region); NSLog(@"regionNew: %@", regionNew); [manager startMonitoringForRegion:regionNew]; } 

Je vais vous expliquer ce que je m'attends à faire:

  1. Enregistrer la position actuelle dans la surveillance de la région.
  2. Notifier à l'user de quitter la région actuelle.
  3. Sur le journal de sortie et enregistrez à nouveau l'location actuel en tant que région.

Cela n'arrive pas.

Où est-ce que je me trompe?

J'ai essayé le simulateur avec 'Freeway Drive'.

METTRE À JOUR:

Testé et fonctionne, en raison d'un bug d'Apple dans le domaine de la geolocation, l'application ne prendra en charge que la version 7.1+, plutôt mauvaise, mais je n'ai pas d'autre idée.

Je pense que la façon dont vous mettez en œuvre la surveillance de la région pourrait causer des problèmes.

Voici les raisons: –

  1. À l'intérieur de la méthode startLocationTracking , votre locationManager est un object local qui ne s'étend pas sur le cycle de vie de cette méthode. Cela signifie également qu'à chaque appel de startLocationTracking , un nouvel object locationManager est alloué avec un nouveau bloc de memory.

    Pour résoudre ce problème: Vous devez utiliser un gestionnaire de locationManager singleton qui est un gestionnaire de locationManager partagé pour l'set du cycle de vie de l'application.

  2. Je crois que vous ne devriez pas startMonitoringForRegion dans la méthode delegate -(void)locationManager:(CLLocationManager *)manager didUpdateLocations: La raison en est que si vous appelez startLocationTracking une fois de plus, il y aura plus d'un startLocationTracking de position. Plusieurs gestionnaires de position peuvent surveiller la même région, ce qui peut provoquer plusieurs notifications.

  3. Après avoir appelé [manager startMonitoringForRegion:region]; , la région ne sera pas surveillée immédiatement. Si vous ne croyez pas me croire, essayez le code suivant: –

     [locationManager startMonitoringForRegion:region]; NSLog(@"%@",locationManager.monitoredRegions); 

Vous découvrirez que la région que vous venez de surveiller ne sera pas à l'intérieur de locationManager.monitoredRegions . Comme cela est géré au niveau iOS, je pense qu'il faudra peut-être quelques minutes pour que la région soit prête à être surveillée.

Vous devez également comprendre les autres limitations de la surveillance de la région dans iOS :

https://developer.apple.com/library/mac/documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html

Une application peut save jusqu'à 20 régions à la fois. Afin de signaler les changements de région en time opportun, le service de surveillance de région nécessite une connectivité réseau.

Dans iOS 6, les régions dont le rayon est compris entre 1 et 400 mètres fonctionnent mieux sur les appareils iPhone 4S ou ultérieurs. (Dans iOS 5, les régions dont le rayon est compris entre 1 et 150 mètres fonctionnent mieux sur l'iPhone 4S et les versions ultérieures.) Sur ces appareils, une application peut recevoir la notification région input ou région sortie en moyenne en 3 à 5 minutes, si pas plus tôt.

Remarque: Les applications peuvent s'attendre à une notification dès que l'appareil se déplace de 500 mètres ou plus à partir de sa notification précédente. Il ne devrait pas s'attendre à des notifications plus fréquemment qu'une fois toutes les cinq minutes. Si le périphérique est capable de récupérer des données à partir du réseau, le gestionnaire de position est beaucoup plus susceptible de délivrer des notifications en time opportun.

Je ne sais pas de quoi parle votre application, je crois que vous devriez revoir la design de votre application. Vous devriez essayer de surveiller la région en dehors des methods déléguées.

Pour plus d'informations sur le LocationManager de Singleton , vous pouvez consulter cette réponse: Services de localization d'arrière – plan ne fonctionnant pas dans iOS 7 . Il existe un projet complet sur GitHub qui contient une class Singleton LocationManager que j'ai nommée LocationTracker .

Vous pourriez également vouloir vérifier un petit problème pour la surveillance de région dans iOS 7 que j'ai trouvé il ya un mois (avec une solution de contournement pour résoudre le glitch): Glitch de surveillance de région sur iOS 7 – Notifications multiples en même time

La réponse la plus satisfaisante aux methods des delegates (didEnterRegion et didExitRegion) n'est pas appelée, Apple Docs dit que vous serez averti après 3 à 5 minutes après l'input ou la sortie, mais dans les tests réels, j'ai trouvé que vous devez attendre environ 7 à 8 minutes.

Je l'ai testé 10 à 15 fois et le rayon de ma région était d'environ 80 mètres. Je me grattais la tête pour voir ce qui n'allait pas. J'ai laissé le simulateur ouvert avec le suivi de localization activé (Utilisé un file gpx pour la simulation d'location). Après 8 minutes, didExitRegion a été appelé.

Aussi, si vous voulez faire cela en arrière-plan, vous devez activer les modes d'arrière-plan sur votre cible. entrez la description de l'image ici