代码之家  ›  专栏  ›  技术社区  ›  Parv Bhasker

startMonitoring重要位置更改不会立即启动

  •  0
  • Parv Bhasker  · 技术社区  · 4 年前

    我正在开发一个导航应用程序,所有内容都在终止、后台和前台状态下工作。 但在终止状态启动的一种情况下,MonitoringSignificantLocationChanges无法自行处理。

    问题是

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

    代码是直接的

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

    并在用户需要时调用跟踪

    significantLocationManager?.startMonitoringSignificantLocationChanges()
    

    Rest我已经处理了应用程序委托中的传入位置事件,以保存在db中。

    所以问题是,我应该如何处理这种画直线的情况?

    0 回复  |  直到 4 年前
        1
  •  3
  •   HereTrix    4 年前

    Apple documentation :

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

    如果您需要尽快收到位置更新,我建议您使用 startUpdatingLocation() 与期望 distanceFilter 属于 CLLocationManager .

        2
  •  1
  •   Diego Jiménez    4 年前

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

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

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

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

    另一件要知道的事情是。苹果公司备注:

    重大变更位置服务需要授权。For 更多信息请求位置服务授权。