【问题标题】:locationManager:didUpdateLocations being called non stop when allowDeferredLocationUpdatesUntilTraveled set?locationManager:didUpdateLocations 在allowDeferredLocationUpdatesUntilTraveled 设置时被不停地调用?
【发布时间】:2014-06-26 17:36:50
【问题描述】:

我正在设置以下内容,我假设它不会根据我的参数调用“didUpdateLocations”,但它每秒调用它大约 3 次?

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager setActivityType:CLActivityTypeAutomotiveNavigation];
    [self.locationManager allowDeferredLocationUpdatesUntilTraveled:15 timeout:3000.0];

设置“allowDeferredLocationUpdatesUntilTraveled”后,它仍然每秒调用大约 3 次?

【问题讨论】:

  • 另一个可能相关的注意事项是allowDeferredLocationUpdatesUntilTraveled: 仅在应用程序处于后台时适用。文档说,当应用程序处于前台时,应用程序将正常接收更新。他们还说,如果另一个应用程序正在使用 GPS(例如地图),那么即使在后台,您的应用程序仍可能正常获取更新。
  • 请注意,当您使用调试器运行应用程序时,延迟位置将不起作用。

标签: ios objective-c cllocationmanager


【解决方案1】:

您可以解决部分您想要的结果 - 仅当它们移动超过 15m 时才更新 - 使用

self.locationManager.distanceFilter = 15;

来自文档:“在生成更新事件之前,设备必须水平移动的最小距离(以米为单位)。”

刚刚在我的 iOS7/8 应用中使用过,似乎在前台运行良好。

对于触发之间的时间,建议您使用 CLLocation 时间戳。

【讨论】:

  • allowDeferredLocationUpdatesUntilTraveled:timeout: 如果距离过滤器大于 0,则会立即失败
  • developer.apple.com/library/ios/documentation/CoreLocation/…,另外位置管理器的distanceFilter属性必须设置为kCLDistanceFilterNone。如果设置为任何其他值,位置管理器会报告 kCLErrorDeferredDistanceFiltered 错误。
【解决方案2】:

当您将ActivityType 设置为 CLActivityTypeAutomotiveNavigation 时,您会告诉您的应用您的导航应用可能会非常活跃。使用导航设置将导致您的应用程序使用的不仅仅是 gps 硬件(例如加速度计)。文档基本上说这会立即耗尽您的电池,您应该计划在活动时插入设备。

allowDeferredLocationUpdates 也适用于您的应用在后台运行时使用。它表示您关心接收位置更新,但您不需要实时更新,因此不要一直唤醒应用。

如果您因为不动而想暂停,请尝试设置 pausesLocationUpdatesAutomatically。

【讨论】:

  • 我将 pausesLocationUpdatesAutomatically 设置为 YES,这是默认设置并注释掉了 setActivityType: 调用,它仍然每秒更新大约 3 次。
  • 当您的应用程序处于前台时,您对接收更新的频率没有任何细粒度的控制。您可以使用距离过滤器仅在您移动一定距离时生成事件,这会有所帮助。您可以做的另一件事是降低所需的准确度。设置正确的活动类型还可以帮助系统确定何时延迟或不传递事件。如果您希望获得尽可能精细的持续更新。
  • 我只想在他们行进超过 15 米且最多每 3 秒更新一次,这对我来说是 allowDeferredLocationUpdatesUntilTraveled: 应该做的。它不做这些。就准确性而言,这是不正确的。我希望尽可能准确,所以我确切地知道它们在哪里,但不要经常更新。
  • 它确实这样做了,但它只在你的应用程序在后台运行时才有效。该文档对行为非常清楚。位置更新有一个时间戳,因此如果您需要 15 米和 3 秒的最大值,您可以实现自己的过滤器,忽略您不想要的过滤器。您应该能够使用距离过滤器来满足 15 米的要求。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2016-03-11
相关资源
最近更新 更多