startMonitoringSignificantLocationChanges 未立即启动

Posted

技术标签:

【中文标题】startMonitoringSignificantLocationChanges 未立即启动【英文标题】:startMonitoringSignificantLocationChanges not starting instantly 【发布时间】:2021-01-30 23:14:21 【问题描述】:

我正在开发一个导航应用程序,一切都在终止、后台和前台状态下工作。 但在终止状态的一种情况下,startMonitoringSignificantLocationChanges 不会自行处理。

问题是

当我启动 startMonitoringSignificantLocationChanges 并杀死应用程序时,我会在 0.5-1 公里后得到位置事件,因为它从我的初始位置绘制直线到我得到的第一个位置事件。但是当位置事件开始时来了就一切顺利 在旅行途中再次出现同样的问题,我打开应用程序检查我的路线状态然后终止应用程序,位置事件再次在 0.5-1 公里后开始出现,并绘制了一条直线。

代码是直的

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

并在用户需要时调用跟踪

significantLocationManager?.startMonitoringSignificantLocationChanges()

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

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

【问题讨论】:

【参考方案1】:

来自Apple documentation:

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

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

【讨论】:

我的应用程序处于终止状态,我猜 startUpdatingLocation 只能在前台和后台工作? 是的。这是最糟糕的事情。在终止状态下,您只能收到重大的位置更改。【参考方案2】:

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

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

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

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

另一件要知道的是。来自 Apple 的备注:

重大变化定位服务需要授权。为了 请求定位服务授权的更多信息。

【讨论】:

以上是关于startMonitoringSignificantLocationChanges 未立即启动的主要内容,如果未能解决你的问题,请参考以下文章