我正在开发一个导航应用程序,所有东西都在终止、后台和前台状态下工作。但在一个终止状态的场景中,启动MonitoringSignificantLocationChanges本身并没有处理。
问题是
- 当我启动startMonitoringSignificantLocationChanges并关闭应用程序时,我会在0.5-1公里后收到位置事件,因为它会从我的初始位置到我收到的第一个位置事件画一条直线。但当定位活动开始时,一切都会顺利进行
- 在旅行过程中,当我打开应用程序检查路线状态,然后终止应用程序时,同样的问题再次出现,位置事件在0.5-1公里后开始,并绘制了一条直线
代码是直接
significantLocationManager = CLLocationManager()
significantLocationManager?.allowsBackgroundLocationUpdates = true
significantLocationManager?.pausesLocationUpdatesAutomatically = false
significantLocationManager?.requestAlwaysAuthorization()
并在用户需要时通过调用跟踪
significantLocationManager?.startMonitoringSignificantLocationChanges()
Rest我已经在应用程序代理中处理了传入的位置事件以保存在数据库中。
所以问题是我应该如何处理这个画直线的场景?
来自苹果文档:
一旦设备距离上次通知移动500米或更远,应用程序就会收到通知。它不应该期望通知频率超过每五分钟一次。如果设备能够从网络中检索数据,则位置管理器更有可能及时发送通知。
如果您需要尽快接收位置更新,我建议使用startUpdatingLocation()
和所需的CLLocationManager
的distanceFilter
。
您可以在后台模式下使用位置更新。来自苹果文档:
当您启动重大更改位置服务时缓存的值可能会立即报告给您的代理。作为新的获取位置数据后,位置经理会调用您的代表具有更新值的locationManager(_:didUpdateLocations:(方法。locations参数始终包含至少一个位置,并且可能包含多个。位置总是按中的顺序报告所以最近的位置总是数组中的最后一项,如清单2所示。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!
// Do something with the location.
}
在这里,您将获得设备中最后一个缓存的位置,当然,如果您在设备中打开了位置服务,它应该非常精确。
还有一件事需要知道。注意事项苹果:
重大更改位置服务需要授权。对于有关请求位置服务授权的详细信息。