Geofencing iOS 6

Je crée une application qui indique à l'user s'il est proche de la destination. Je calcule la distance entre l' currentLocation et la destination. Je fais le calcul dans le didUpdateLocations . Cela fonctionne mais j'ai vu qu'il y a des methods qui peuvent y faire face sans avoir besoin de faire des calculs.

CLLocationManager la région dans le CLLocationManager ; cependant il semble que les methods didExitRegion et didEnterRegion n'ont pas été appelées.

Voici la partie du code où j'inscris la région:

 - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.locationManager startUpdatingLocation]; [self.mySearchBar resignFirstResponder]; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; self.distToRemind = 0; [worldMap removeAnnotations:[worldMap annotations]]; NSLog(@"executou de primeira"); CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder geocodeAddressSsortingng:[self.mySearchBar text] completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *placemark = [placemarks lastObject]; //test //DefaultAnnotation *annot = [[DefaultAnnotation alloc] initWithCoordinate:placemark.location.coordinate andTitle:@""]; CLRegion *newRegion = [[CLRegion alloc] initCircularRegionWithCenter:placemark.location.coordinate radius:10.0 identifier:@"RegionBoundary"]; DefaultAnnotation *regionAnnotation = [[DefaultAnnotation alloc] initWithCoordinate:newRegion.center andTitle:@""]; [self identifyPlacemark:placemark andSetAnnotation:regionAnnotation]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(regionAnnotation.coordinate, 250, 250); [worldMap addAnnotation:regionAnnotation]; [worldMap setRegion:region animated:YES]; [self.locationManager startMonitoringForRegion:newRegion]; if (self.boolPushButtonTapped) { [self pushButtonTapped]; } } ]; } 

Est-ce que je fais quelque chose de mal ici?

Ok, quelques choses à garder à l'esprit lorsque vous utilisez la capacité de surveillance de la région dans iOS.

  • Les régions vont par défaut à la taille minimale, peu importe ce que vous définissez le rayon initial. Un ingénieur d'Apple m'a dit qu'il est 100M pour les appareils compatibles GPS. 450M pour les appareils Wifi uniquement qui prennent en charge la surveillance de la région (iPad 3 et nouveaux iPod touch)
  • Les régions que vous pouvez surveiller sont un produit limité. Le nombre total pouvant être surveillé sur un seul périphérique est limité. Encore une fois, un ingénieur d'Apple m'a dit qu'il y avait environ 100 régions. Utilisez les methods déléguées pour vous assurer que votre région a bien été ajoutée.
  • Les régions sont très utiles et ont un impact minimal sur la durée de vie de la batterie. Ils ont également leur propre icône de localization dans la barre d'état. (flèche pourpre creuse)
  • Ils fonctionnent très bien comme toutes les autres API d'location, vous devez répondre correctement aux methods déléguées pour interpréter les actions en cours.

Votre code semble bon, mais il manque la logique entourant votre CLLocationManagerDelegate . Sans un délégué approprié pour gérer les callbacks, il vous manque probablement les callbacks ( -didExitRegion/-didEnterRegion ).

Dans mon expérience, je crée une class singleton pour gérer toutes mes methods de délégué de gestionnaire d'location. Assurez-vous de vous inscrire pour les écouter. Si vous incluez un peu plus de code entourant ces appels de délégué, je serais heureux de vous aider davantage. Il existe de nombreux tutoriels qui devraient documenter comment les configurer correctement. Bonne chance.

* Note: J'ai parlé à un ingénieur de localization à la WWDC cette année de beaucoup de ces inconnues entourant la taille de la région min et le nombre de régions. Je peux confirmer la taille de la région min à 100, mais pas le nombre maximum de régions. Je n'ai pas eu le besoin pour le moment.