Comment utiliser les notifications push géo-basées sur iOS?

Est-il possible d'utiliser des notifications push géo-basées sur iOS lorsque l'application est supprimée (pas en arrière-plan)?

Je suis intéressé par la construction d'une application, où l'user choisira une position sur une carte, et si par exemple il / elle est proche de cette zone, une notification locale basée sur la geolocation serait déclenchée.

Cependant, cette "idée" est-elle même possible? Est-ce que le GPS peut exécuter et comparer les coordonnées lorsque l'application est mise à mort et exécuter et informer l'user quand il est en place? Y at-il un tutoriel / article / plus d'informations sur le sujet que je pourrais lire?

La plupart des informations que j'ai lues en ligne ressemblaient plus à des idées générales de mise en œuvre sans rien de spécifique à ce sujet.

Pour le suivi de l'location d'un user alors que l'application n'est pas en cours d'exécution (c'est-à-dire qui a été précédemment terminée), il existe deux options:

  1. Dans le guide de programmation de l'application iOS, sous "Suivi de l'location de l'user":

    Le service de localization à changement significatif est fortement recommandé pour les applications qui n'ont pas besoin de données de localization de haute précision. Avec ce service, les mises à jour d'location sont générées uniquement lorsque l'location de l'user change de manière significative; par conséquent, il est idéal pour les applications sociales ou les applications qui fournissent à l'user des informations non critiques et pertinentes pour l'location. Si l'application est suspendue lorsqu'une mise à jour se produit, le système la réveille en arrière-plan pour gérer la mise à jour. Si l'application démarre ce service et est ensuite terminée, le système relance l'application automatiquement lorsqu'un nouvel location devient disponible . Ce service est disponible dans iOS 4 et versions ultérieures et il est disponible uniquement sur les appareils qui contiennent une radio cellulaire.

    Cependant, selon la reference de la class CLLocationManager , ce n'est pas trop précis et les mises à jour sont peu fréquentes:

    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.

  2. La surveillance de région fonctionne de la même manière – y compris le redémarrage de l'application après sa terminaison – mais avec une plus grande précision (en fonction de la disponibilité des réseaux Wifi et des tours de téléphonie cellulaire):

    Les distances de seuil spécifiques sont déterminées par le matériel et les technologies de localization actuellement disponibles. Par exemple, si le Wi-Fi est désactivé, la surveillance de la région est nettement less précise. Cependant, à des fins de test, vous pouvez supposer que la distance minimale est d'environ 200 mètres.

    Une autre considération de surveillance de région est que (selon la reference de la class CLLocationManager ) les notifications d'input et de sortie de région ne peuvent être reçues que 3-5 minutes après avoir traversé les limites de la région.

    En fonction des besoins réels, la surveillance de la région peut être utilisée pour get un location "approximatif", puis lorsque l'user se trouve dans une région spécifique, démarrer le service GPS le plus précis sur le gestionnaire de localization. Lorsque l'user quitte la région d'intérêt, désactivez le service GPS pour préserver la batterie et revenez au service de surveillance de l'location approximatif (c'est-à-dire la surveillance de la région) une fois de plus. Voici une implémentation de base:

    SomeViewController.m :

    ... @interface SomeViewController () <CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, strong) CLRegion *someRegion; @end @implementation SomeViewController - (void)viewDidLoad { [super viewDidLoad]; self.locationManager = [[CLLocationManager alloc] init]; CLLocationDistance radius = 10; // 10 metre sensitivity self.someRegion = [[CLRegion alloc] initCircularRegionWithCenter:someCoordinates radius:radius identifier:@"Smithtown Dry Cleaners"]; self.locationManager.delegate = self; [self.locationManager startMonitoringForRegion:self.someRegion]; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.distanceFilter = 10; [self.locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { [self.locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { [self.locationManager stopUpdatingLocation]; } // Delegate method from the CLLocationManagerDelegate protocol. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation* location = [locations lastObject]; // If the user's current location is not within the region anymore, stop updating if ([self.someRegion containsCoordinate:location.coordinate] == NO) { [self.locationManager stopUpdatingLocation]; } NSSsortingng *locationData = [NSSsortingng ssortingngWithFormat:@"latitude %+.6f, longitude %+.6f\n", location.coordinate.latitude, location.coordinate.longitude]; NSLog(@"%@", locationData); UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = locationData; localNotification.alertAction = @"Location data received"; localNotification.hasAction = YES; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; } 

    N'oubliez pas d'append les inputs appropriées au file plist de l'application pour que l'application s'exécute en arrière-plan et accède aux ressources appropriées:

    MyApp-Info.plist :

     <key>UIBackgroundModes</key> <array> ... <ssortingng>location</ssortingng> </array> <key>UIRequiredDeviceCapabilities</key> <array> ... <ssortingng>location-services</ssortingng> <ssortingng>gps</ssortingng> </array> 

    Le code ci-dessus suppose l'utilisation de iOS6 et ARC