iOS re-vérifier l'location sur la charge de l'arrière-plan

Je construis une application qui affiche datatables de résultats en fonction de votre location actuel.

À l'heure actuelle, j'utilise la méthode viewDidLoad d'un UIViewController pour démarrer le CLLocationManager et get l'location actuel. Une fois que j'ai l'location qui correspond à la précision que je désire, je fais une request à mon service Web pour get les résultats et le vider dans un UITableView .

Mon problème est que lorsque vous fermez l'application (même si elle fonctionne toujours en arrière-plan). Si vous conduisez vers une autre ville, rouvrez l'application, datatables ne sont pas mises à jour et continue à afficher les résultats de votre ancien location.

Fondamentalement, lorsque le UIViewController charge de l'arrière-plan, je dois être en mesure de vérifier l'location des users, et s'ils ont déplacé une distance significative, mettre à jour le contenu de mon UITableView .

Toutefois, étant donné que viewDidAppear de UIViewController n'est pas déclenché lorsque vous chargez l'application à partir de l'arrière-plan, je ne suis pas sûr de la méthode que je peux utiliser.

Je connais la méthode stopMonitoringSignificantLocationChanges qui réveille votre application lorsqu'un nouvel location est trouvé. Cependant, cela semble un peu OTT parce que j'ai seulement besoin de savoir une fois que l'application a été chargée.

Existe-t-il une alternative à l'utilisation de la méthode stopMonitoringSignificantLocationChanges ?

Vous pouvez vous inscrire pour recevoir des notifications de UIApplication dans -viewDidLoad . Vous pouvez être intéressé par UIApplicationDidBecomeActiveNotification . L'inscription pour les notifications est facile.

 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; } 

Dans -viewDidLoad nous nous ajoutons en tant qu'observateur de la UIApplicationDidBecomeActiveNotification et UIApplicationDidBecomeActiveNotification un sélecteur à UIApplicationDidBecomeActiveNotification lorsque cette notification particulière est reçue.

 - (void)applicationDidBecomeActive:(NSNotification *)notification { // Kick off your CLLocationManager [self updateCurrentLocation]; } - (void)viewDidUnload { [super viewDidUnload]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; } 

Enfin, n'oubliez pas de vous retirer en tant qu'observateur pour cette notification lorsque la vue est déchargée. Il est recommandé d'équilibrer vos appels addObserver / removeObserver à NSNotificationCenter de cette manière.

Vous pouvez save votre vue pour les notifications. Pour les vues qui ont besoin de garder une trace de l'état de l'application, j'utilise cette superclass pratique.

 @implementation BackgroundAwareObject -init { if(self=[super init]) { NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(notifyApplicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; [center addObserver:self selector:@selector(notifyApplicationWillEnterForeground:) name: UIApplicationWillEnterForegroundNotification object:nil]; [center addObserver:self selector:@selector(notifyApplicationDidFinishLaunching:) name: UIApplicationDidFinishLaunchingNotification object:nil]; [center addObserver:self selector:@selector(notifyApplicationDidBecomeActive:) name: UIApplicationDidBecomeActiveNotification object:nil]; [center addObserver:self selector:@selector(notifyApplicationWillResignActive:) name: UIApplicationWillResignActiveNotification object:nil]; [center addObserver:self selector:@selector(notifyApplicationDidReceiveMemoryWarning:) name: UIApplicationDidReceiveMemoryWarningNotification object:nil]; [center addObserver:self selector:@selector(notifyApplicationWillTerminate:) name: UIApplicationWillTerminateNotification object:nil]; } return self; } -(void)notifyApplicationDidEnterBackground:(NSNotification*)n { [self applicationDidEnterBackground:[UIApplication sharedApplication]]; } -(void)notifyApplicationWillEnterForeground:(NSNotification*)n { [self applicationWillEnterForeground:[UIApplication sharedApplication]]; } -(void)notifyApplicationDidFinishLaunching:(NSNotification*)n { [self application:[UIApplication sharedApplication] didFinishLaunchingWithOptions: [n userInfo]]; } -(void)notifyApplicationDidBecomeActive:(NSNotification*)n { [self applicationDidBecomeActive:[UIApplication sharedApplication]]; } -(void)notifyApplicationWillResignActive:(NSNotification*)n { [self applicationWillResignActive:[UIApplication sharedApplication]]; } -(void)notifyApplicationDidReceiveMemoryWarning:(NSNotification*)n { [self applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]]; } -(void)notifyApplicationWillTerminate:(NSNotification*)n { [self applicationWillTerminate:[UIApplication sharedApplication]]; } -(void)configurationChanged { // User has update application configuration panel } - (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. } - (void)applicationWillResignActive:(UIApplication *)application { /* Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. */ } - (void)applicationDidEnterBackground:(UIApplication *)application { /* Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. If your application supports background execution, called instead of applicationWillTerminate: when the user quits. */ _background = YES; } - (void)applicationWillEnterForeground:(UIApplication *)application { /* Called as part of transition from the background to the active state: here you can undo many of the changes made on entering the background. */ } - (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ _background = NO; } /** applicationWillTerminate: saves changes in the application's managed object context before the application terminates. */ - (void)applicationWillTerminate:(UIApplication *)application { } // try to clean up as much memory as possible. next step is to terminate app - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { } -(void)dealloc { [[NSNotificationCenter defaultCenter]removeObserver:self]; [super dealloc]; } @end 

Dans votre AppDelegate.m vous devez avoir cette méthode prédéfinie (comme dans le model que vous avez créé initialement au démarrage de votre projet dans Xcode) –

 - (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ } 

Comme la description le dit, cette méthode est appelée automatiquement par iOS lorsque l'application est sur le sharepoint devenir active. Ici vous pouvez get le dernier location pour faire un traitement ultérieur.