web-dev-qa-db-fra.com

Obtenez des mises à jour de localisation pour l'application iOS même en cas de suspension

Début 2014, Apple a mis à jour iOS 7.0 à 7.1 afin de permettre les mises à jour de localisation même lorsque l'application n'est pas active au premier plan et pas en arrière-plan. Comment faire?

J'ai lu des articles comme iOS 7.1 d'Apple corrigera un bug de géolocalisation . Mais Apple n'a pas fourni beaucoup de communication à ce sujet ni aucun exemple de code sur la façon d'obtenir la mise à jour de l'emplacement même lorsque l'application est tuée/arrêtée/suspendue.

J'ai lu les Release Notes for iOS 7.1 . Je n'ai rien trouvé de semblable à ça non plus.

Alors, comment pouvons-nous réellement obtenir la mise à jour de l'emplacement pour iOS 7 et 8 même lorsque l'application est suspendue?

31
Ricky

Après des mois d'essais et d'erreurs en expérimentant le framework Core Location , j'ai trouvé la solution pour obtenir une mise à jour de l'emplacement même lorsque l'application est supprimée/suspendue. Cela fonctionne bien pour iOS 7 et 8.

Voici la solution: -

Si votre application est une application mobile basée sur la localisation qui doit surveiller la position de l'appareil lorsqu'elle subit des changements importants, l'iOS vous renverra des coordonnées de localisation lorsque l'appareil s'est éloigné de plus de 500 mètres du dernier emplacement connu. Oui, même lorsque l'application est supprimée/suspendue par l'utilisateur ou iOS lui-même, vous pouvez toujours obtenir les mises à jour de l'emplacement.

Donc, pour qu'un locationManager obtienne une mise à jour de l'emplacement même lorsque l'application est supprimée/suspendue, vous devez utiliser la méthode startMonitoringSignificantLocationChanges, vous ne pouvez pas utiliser startUpdatingLocation.

Lorsque iOS souhaite renvoyer la mise à jour de l'emplacement à l'application, cela vous aidera à relancer l'application et à renvoyer une clé UIApplicationLaunchOptionsLocationKey à la méthode déléguée de l'application didFinishLaunchingWithOptions.

La clé UIApplicationLaunchOptionsLocationKey est très importante et vous devez savoir comment la gérer. Vous devez créer une nouvelle instance de locationManager lorsque vous recevez la clé et vous obtiendrez la mise à jour de l'emplacement sur la méthode déléguée locationManager didUpdateLocations.

Voici l exemple de code:-

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.shareModel = [LocationShareModel sharedModel];

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { 
      self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
      self.shareModel.anotherLocationManager.delegate = self;
      self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
      self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;

      if(IS_OS_8_OR_LATER) {
        [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
      }

     [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];   

    }    
        return YES;
 }

En plus de la méthode didFinishLaunchingWithOptions, j'ai créé l'instance locationManager lorsque l'application est active. Voici quelques exemples de code:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];

    if(IS_OS_8_OR_LATER) {
        [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
    }

    [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if(self.shareModel.anotherLocationManager)
        [self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];

    self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
    self.shareModel.anotherLocationManager.delegate = self;
    self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;

    if(IS_OS_8_OR_LATER) {
        [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
    }

    [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}

J'ai écrit un article expliquant les détails sur la façon d'obtenir la mise à jour de l'emplacement pour iOS 7 et 8 même lorsque l'application est supprimée/suspendue. J'ai également téléchargé le code source complet sur GitHub avec les étapes sur la façon de tester cette solution.

Veuillez visiter les URL suivantes pour plus d'informations: -

  1. Obtenir des mises à jour de localisation pour iOS 7 et 8 lorsque l'application est supprimée/arrêtée/suspendue
  2. Code source sur GitHub - Obtenez les mises à jour de l'emplacement même lorsque les applications mobiles iOS sont suspendues/interrompues/supprimées
76
Ricky
locationManager = [[CLLocationManager alloc] init];
#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)


if(IS_OS_8_OR_LATER)
{
    [locationManager requestWhenInUseAuthorization];
}

locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;

[locationManager startUpdatingLocation];

que la mise à jour de l'emplacement de l'utilisateur du code ne fonctionne qu'en premier plan, mais pas en arrière-plan

[locationManager requestWhenInUseAuthorization];
0
Jayesh Miruliya