2017-03-12 1 views
0

J'écris une application qui utilise l'emplacement pour deux raisons:geofences de mise à jour avec une faible précision en arrière-plan, la position de mise à jour sur la carte à haute précision, ne fonctionne pas comme prévu

1) Il montre l'emplacement de l'utilisateur 2) En arrière-plan, même lorsqu'il est fermé, il obtient les 20 points d'intérêt les plus proches (liste stockée dans userdefaults) et une carte (avec une précision de navigation) dans une instance de gestionnaire d'emplacement. active un geofence pour ceux-ci, de sorte que l'utilisateur est remarqué en arrivant à proximité. Ceci est fait par la plus basse précision possible (3km) pour économiser de l'énergie, et mise en place dans une autre instance de gestionnaire de localisation, initiée lors de la première ouverture de l'application. Le problème est que l'objet CLLocationmanager semble être statique, donc quand je l'appelle de deux endroits différents, c'est la même instance qui est retournée, et la précision, les intervalles, etc, semblent être les mêmes, puisque les deux délégués sont appelé simultanément tout le temps. Par conséquent, la méthode d'installation geofences est appelée tout le temps, lorsque l'utilisateur vient de bouger un peu, ce que je veux que la carte reflète.

+2

Vous devez modifier les paramètres d'une instance unique de CLLocationManager, ou mieux encore, utiliser le mode de changement d'emplacement significatif en arrière-plan. Et vérifiez si vous êtes actuellement au premier plan ou à l'arrière-plan lors de la mise à jour des geofences, ou vérifiez le delta Ove avant de mettre à jour les geofences – Paulw11

Répondre

0

l'objet CLLocationmanager semble être statique

Eh oui! CLLocationmanager object est un singleton donc les objets différents ne peuvent pas être créés. Pour résoudre votre problème, vous devez vérifier que vous l'état d'application, ce qui peut être fait en utilisant:

[[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground 

Une fois que vous connaissez l'état de l'application, vous pouvez configurer les propriétés de l'objet de CLLocationmanager en conséquence. J'espère que cela aide!

1

Oui, il n'y a qu'un seul gestionnaire d'emplacement. Donc, reconfigurez-le quand vous allez en arrière-plan et quand vous revenez au premier plan. Il peut être pratique de basculer son délégué vers un autre objet à ces moments également (de sorte que chaque objet délégué puisse se concentrer sur un problème).

+0

En changeant de délégué, voulez-vous dire ... l'objet le plus récent que vous attribuez comme délégué? – Honey

+0

Je veux dire que vous pouvez avoir un LocationDelegate qui gère le suivi de premier plan et un tout autre qui gère le suivi de l'arrière-plan (il semble que vous l'ayez déjà). Lorsque vous passez en arrière-plan, appelez 'locationManager.delegate = myBackgroundDelegate' pour passer à l'autre logique. (Par "passe en arrière-plan" je veux dire "applicationDidEnterBackground") –