startMonitoringSignificantLocationChanges未立即启动



我正在开发一个导航应用程序,所有东西都在终止、后台和前台状态下工作。但在一个终止状态的场景中,启动MonitoringSignificantLocationChanges本身并没有处理。

问题是

  • 当我启动startMonitoringSignificantLocationChanges并关闭应用程序时,我会在0.5-1公里后收到位置事件,因为它会从我的初始位置到我收到的第一个位置事件画一条直线。但当定位活动开始时,一切都会顺利进行
  • 在旅行过程中,当我打开应用程序检查路线状态,然后终止应用程序时,同样的问题再次出现,位置事件在0.5-1公里后开始,并绘制了一条直线

代码是直接

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

并在用户需要时通过调用跟踪

significantLocationManager?.startMonitoringSignificantLocationChanges()

Rest我已经在应用程序代理中处理了传入的位置事件以保存在数据库中。

所以问题是我应该如何处理这个画直线的场景?

来自苹果文档:

一旦设备距离上次通知移动500米或更远,应用程序就会收到通知。它不应该期望通知频率超过每五分钟一次。如果设备能够从网络中检索数据,则位置管理器更有可能及时发送通知。

如果您需要尽快接收位置更新,我建议使用startUpdatingLocation()和所需的CLLocationManagerdistanceFilter

您可以在后台模式下使用位置更新。来自苹果文档:

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

func locationManager(_ manager: CLLocationManager,  didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!

// Do something with the location. 
}

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

还有一件事需要知道。注意事项苹果:

重大更改位置服务需要授权。对于有关请求位置服务授权的详细信息。

最新更新