5

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

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

我解决这个问题的方法如下:

  • 用户第一次启动应用程序时,我开始使用他当前的位置监视一个区域
  • 如果触发了didExitRegion,我执行 API 调用并使用当前位置作为新区域中心的新区域替换当前监控区域。

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

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

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

谢谢

4

2 回答 2

3

我在didExitRegion:可靠射击方面运气不佳。它经常在比我所在地区的边缘更远的地方开火。

如果您只需要每 2 公里左右调用一次 API,我建议您使用CLLocationManager's 。-startMonitoringSignificantLocationChanges如果您的准确性/精度很重要,只需将位置服务注册为必要的后台状态(UIBackgroundModes在您的应用程序列表中;您可能也需要这样做才能从后台使用重大更改 API),并使用 normal -startUpdatingLocation,适当distanceFilter和实例desiredAccuracy上的字段值。CLLocationManager

于 2012-11-03T23:59:20.160 回答
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 进行后台处理。其他地方的大量文档。

希望有帮助。

于 2013-07-31T11:08:41.933 回答