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备忘单:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...