CLLocation Manager 有时会给出不正确的位置

Posted

技术标签:

【中文标题】CLLocation Manager 有时会给出不正确的位置【英文标题】:CLLocation Manager giving incorrect location sometime 【发布时间】:2019-06-28 17:21:44 【问题描述】:

我正在使用 ios 的核心位置 API(CLLocation 管理器),它有时会给我错误的位置,比如如果我在美国,它会给我西班牙的纬度和经度。搜索堆栈溢出相同但无法获得我的查询的相关答案。作为新手使用地图和位置,我有点困惑。任何帮助将不胜感激。

【问题讨论】:

这是仅在模拟器上还是在物理设备上? 【参考方案1】:

我假设您使用的是物理设备而不是模拟器来测试它,并且您没有选择在 xcode 中模拟位置的选项。有时 CLLocation 管理器可以返回例如一个旧的缓存位置,所以也许这就是发生在你身上的事情。在你对收到的 CLLocation 对象做任何事情之前,我建议检查它的 Horizo​​ntalAccuracy 和 timestamp 属性。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    guard let lastLocation = locations.last, lastLocation.horizontalAccuracy < 1000, abs(lastLocation.timestamp.timeIntervalSinceNow) < 60 else 
        // location not accurate or to old (cached previously) so do not do anything
        return
    
    // do something

【讨论】:

【参考方案2】:

实际上,Apple 使用周围的 wifi 设备进行位置检测。因此,在“冷”启动时,gps 芯片需要一些时间来启动和查找卫星,并且在此期间设备使用基于路由器周围 MAC 地址的位置。如果您(或您邻居的)路由器曾经在西班牙,那就是原因 - Apple 的 mac 地址数据库刷新非常缓慢,可能需要 1-3 个月。

【讨论】:

以上是关于CLLocation Manager 有时会给出不正确的位置的主要内容,如果未能解决你的问题,请参考以下文章

CLLocation Manager 使用默认位置而不是使用实际位置进行更新

iOS - CLLocation Manager didUpdateLocations 在一个类中被调用,而不是在另一个类中?

CLLocation Manager如何在一定距离后更新

未调用 CLLocation Manager didStartMonitoringForRegion 委托方法

iOS - CLLocation Manager didUpdateLocations 调用了太多时间

Swift 中的 CLLocation 管理器获取用户的位置