startUpdatingLocation de LocationManager via une notification push silencieuse

Je crée une application qui doit se réveiller en arrière-plan à un moment donné.

J'ai essayé :

  1. UILocalNotification: Mais je ne veux pas utiliser UILocalNotification car il a besoin de l'interaction de l'user pour taper sur la notification et que seule l'application va se réveiller et démarrer le gestionnaire de l'location.

  2. J'ai également utilisé [locationManager startUpdatingLocation]; activé avec les mises à jour des modes d'arrière-plan, cela fonctionne mais il faudra beaucoup de batterie.

Donc, avec l'utilisation de la nouvelle fonction iOS 7 Silent pushNotification et didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: méthode que j'ai besoin de démarrer le gestionnaire de position en arrière-plan,

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSLog(@"Receive RemoteNotification in fetchCompletionHandler with UserInfo:%@",userInfo); application.applicationIconBadgeNumber=0; __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ [self.locationManager startUpdatingLocation]; [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; } 

La notification silencieuse Push fonctionne correctement,

Charge utile pour PushNotification:

 {"aps" : {"content-available" : 1},"SilentPushId" : "07"} 

Mais cela ne va pas démarrer le gestionnaire de l'location, s'il vous plaît quelqu'un m'aider.

MODIFIER:

Si ce n'est pas possible, donnez-moi quelques suggestions.

J'ai implémenté avec succès cette utilisation Pushnotification silencieuse et appelez startUpdatingLocation et je suis en mesure d'get des données de localization dans la méthode de délégué:

Utiliser cette charge utile:

 { "aps": { "content-available": 1 }, "SilentPush": "4" } 

J'ai activé l'location et la notification à distance pour le mode Arrière-plan: entrez la description de l'image ici

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler { __block UIBackgroundTaskIdentifier bgTask =0; UIApplication *app = [UIApplication sharedApplication]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [self.locationManager startUpdatingLocation]; }]; 

didUpdateLocations

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { lastLoc=[locations lastObject]; [logFile addLocObject:[NSSsortingng ssortingngWithFormat:@"Loc: %@",lastLoc]]; } 

Vous ne pouvez pas. Il est explicitement interdit de démarrer les services de localization lorsque l'application est en arrière-plan. L'user doit être conscient du début avec l'application ouverte.

Imaginez quel suivi subversif serait disponible si vous pouviez envoyer des notifications silencieuses pour triggersr une mise à jour d'location vers un server sans que l'user ne s'en rende count …

Ce que vous pouvez faire, en arrière-plan, c'est recevoir des events significatifs et des events de limites. Je peux imaginer tirer parti de cette capacité pour garder un journal des locations récents de toutes sortes. Lorsque votre notification à distance est reçue, répondez en envoyant le dernier location connu. Avec un peu d'expérimentation, je suis sûr que vous pourriez affiner cela pour être raisonnablement précis avec peu d'impact sur la batterie.

Si vous voulez mettre à jour l'location en mode d'arrière-plan, il vous suffit d'activer UIBackgroundModes dans un file plist. Voir la description de startUpdatingLocation dans le document de Apple .

Si vous démarrez ce service et que votre application est suspendue, le système interrompt la livraison des events jusqu'à ce que votre application redémarre (au premier plan ou en arrière-plan). Si votre application est interrompue, la livraison des nouveaux events de localization s'arrête complètement. Par conséquent, si votre application doit recevoir des events d'location en arrière-plan, elle doit inclure la key UIBackgroundModes (avec la valeur d'location) dans son file Info.plist.

Vous pouvez l'activer pour la mise à jour en arrière-plan dans votre xcode5 + comme ci-dessous.

entrez la description de l'image ici