微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

startMonitoringSignificantLocationChanges不是立即开始

如何解决startMonitoringSignificantLocationChanges不是立即开始

我正在开发一个导航应用程序,所有工作都在终止,背景和前基状态下进行。 但是在一种终止状态下,startMonitoringSignificantLocationChanges不会自行处理。

问题是

  • 当我启动startMonitoringSignificantLocationChanges并终止了该应用程序时,我遇到了0.5-1km之后的位置事件,因为它会从我的初始位置到我得到的第一个位置事件绘制一条直线。但是当位置事件开始时来了,一切都会顺利进行
  • 当我在旅途中打开应用程序以检查我的路线状态,然后终止应用程序时,同样的问题再次发生。在0.5-1km之后,位置事件再次开始,并绘制了一条直线。

代码是直接的

    significantLocationManager = CLLocationManager()
    significantLocationManager?.allowsBackgroundLocationUpdates = true
    significantLocationManager?.pausesLocationUpdatesAutomatically = false
    significantLocationManager?.requestAlwaysAuthorization()

并在用户需要时调用跟踪

significantLocationManager?.startMonitoringSignificantLocationChanges()

其他情况下,我已经处理了应用程序委托中的传入位置事件以保存在数据库中。

所以问题是我应该如何处理绘制直线的情况?

解决方法

来自Apple documentation

只要设备从先前的通知移开500米或更多,应用程序就会收到通知。它不应期望通知的频率超过每五分钟一次。如果设备能够从网络检索数据,则位置管理器更有可能及时传递通知。

如果您需要尽快收到位置更新,建议您将startUpdatingLocation()distanceFilter中的CLLocationManager一起使用。

,

您可以在后台模式下使用位置更新。来自Apple documentation

启动重大更改位置服务时, 缓存的值可能会立即报告给您的代表。作为新 获取位置数据后,位置经理会致电您代表的 具有更新值的locationManager(_:didUpdateLocations :)方法。 locations参数始终至少包含一个位置,并且可以 包含多个。位置始终按以下顺序报告 是他们确定的,所以最近的位置始终是 数组中的最后一项,如清单2所示。

func locationManager(_ manager: CLLocationManager,didUpdateLocations locations: [CLLocation]) {
   let lastLocation = locations.last!
               
   // Do something with the location. 
}

在这里,您将获得设备中的最后一个缓存位置,如果您在设备中打开了位置服务,则应该非常准确。

这是另一件事。 Apple备忘单:

重大更改位置服务需要授权。对于 更多信息请求位置服务授权。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。