在后台更新低准确度的地理围栏,以高精度更新地图上的位置,无法按预期工作

Posted

技术标签:

【中文标题】在后台更新低准确度的地理围栏,以高精度更新地图上的位置,无法按预期工作【英文标题】:Updating geofences with low accuracy in background, update position on map at high accuracy, does not work as intended 【发布时间】:2017-03-12 20:08:45 【问题描述】:

我正在编写一个将位置用于两个目的的应用程序:

1) 它在位置管理器实例和委托中显示用户在地图上的位置(具有导航般的准确性),包含在视图控制器中

2) 在后台,即使关闭,它也会获取最近的 20 个兴趣点(列表存储在 userdefaults 中)并为这些兴趣点激活地理围栏,因此当用户靠近时会被注意到。这是通过尽可能低的精度(3 公里)来节省电量,并在另一个位置管理器实例中设置,在首次打开应用程序时启动。

问题是,CLLocationmanager 对象似乎是静态的,所以当我从两个不同的地方调用它时,它返回的是同一个实例,并且准确性、间隔等似乎是相同的,因为两个代表都被调用一直同时。

因此,geofences setup 方法一直被调用,当用户移动一点时,我希望地图能够反映这一点。

【问题讨论】:

您应该修改单个 CLLocationManager 实例的设置,或者甚至更好,在后台使用显着的位置更改模式。并在更新地理围栏时检查您当前是在前台还是后台,或者在更新地理围栏之前检查 delta Ove 【参考方案1】:

是的,只有一位位置经理。所以当你进入后台和回到前台时重新配置它。在这些时候也可以方便地将其委托切换到另一个对象(这样每个委托对象都可以专注于一个问题)。

【讨论】:

切换代理是指...您指定为代理的最新对象? 我的意思是你可以有一个 LocationDelegate 来处理前景跟踪和一个完全不同的处理后台跟踪(听起来你已经有了)。当您进入后台时,只需调用locationManager.delegate = myBackgroundDelegate 即可切换到其他逻辑。 (“进入后台”是指“applicationDidEnterBackground”)【参考方案2】:

CLLocationmanager 对象似乎是静态的

是的! CLLocationmanager object 是一个 Singleton,因此无法创建不同的对象。要解决您的问题,您需要检查您的申请状态,这可以使用:

[[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground

一旦您知道应用程序状态,您就可以相应地配置 CLLocationmanager 的对象属性。希望对您有所帮助!

【讨论】:

以上是关于在后台更新低准确度的地理围栏,以高精度更新地图上的位置,无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

地理围栏精度

Android:提高地理围栏的准确性

在后台服务中创建地理围栏

如何使地理围栏准确?

iOS蓝色状态栏同时使用地理围栏/背景位置更新来触发通知

iOS 7 后台定位更新精度高、电池使用率低且禁用暂停