从didExitRegion获得准确的坐标

时间:2012-10-17 18:08:10

标签: iphone objective-c ios5 cllocationmanager

我正在实施一个应用,我需要通过以下方式跟踪用户的位置:

  • 在应用处于后台或关闭时跟踪用户的位置
  • 如果用户的位置改变了大约2000米,我应该执行API调用。

我解决此问题的方法如下:

  • 用户首次启动应用时,我开始使用当前位置监控某个地区
  • 如果 didExitRegion 被触发,我执行API调用并使用当前位置作为新区域的中心,用新区域替换当前受监控区域。

当应用程序位于前台时,这可以正常工作,因为从位置管理器返回的位置是准确的。

但是如果应用程序在后台,那么位置管理器将不会返回准确的位置,因为它是第一次运行并且返回的第一个坐标不准确。

问题是如何在后台触发 didExitRegion 时获得用户的准确位置?

感谢

2 个答案:

答案 0 :(得分:3)

didExitRegion:可靠地射击我没有太多运气;它经常远远超过我所在地区的边缘。

如果您每2公分左右需要一次API调用,我建议您使用CLLocationManager的{​​{3}}。如果您的准确性/精确度很重要,只需将位置服务注册为必要的背景状态(-startMonitoringSignificantLocationChanges在您的应用程序plist中;您可能需要这样做才能从后台使用重要的更改API),并使用正常-startUpdatingLocationCLLocationManager个实例上有适当的UIBackgroundModesdistanceFilter字段值。

答案 1 :(得分:0)

这里发生了一些事情。

您提到区域更改触发器是一个小变量。这是故意的;为了避免在沿着两个区域之间的边界向下走时触发大量触发器,在时间和位置上都会有一些触发的粘性。

来自文档(http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

The system does not report boundary crossings until the boundary plus a designated cushion distance is exceeded. You specify the desired cushion distance for a region when you register it using the startMonitoringForRegion:desiredAccuracy: method. This cushion value prevents the system from generating numerous entered and exited events in quick succession while the user is traveling close the edge of the boundary.

获得准确的位置与正常情况没有什么不同。您启动位置管理器并等到获得所需精度的位置更新。关闭经理并使用该职位。

因为你在后台运行,所以你只有十分钟的时间来做这件事,你必须告诉操作系统你正在使用UIApplication的startBackgroundTaskWithExceptionHandler进行后台处理。关于其他地方的大量文件。

希望有所帮助。