CLLocation Manager 有时会给出不正确的位置
Posted
技术标签:
【中文标题】CLLocation Manager 有时会给出不正确的位置【英文标题】:CLLocation Manager giving incorrect location sometime 【发布时间】:2019-06-28 17:21:44 【问题描述】:我正在使用 ios 的核心位置 API(CLLocation 管理器),它有时会给我错误的位置,比如如果我在美国,它会给我西班牙的纬度和经度。搜索堆栈溢出相同但无法获得我的查询的相关答案。作为新手使用地图和位置,我有点困惑。任何帮助将不胜感激。
【问题讨论】:
这是仅在模拟器上还是在物理设备上? 【参考方案1】:我假设您使用的是物理设备而不是模拟器来测试它,并且您没有选择在 xcode 中模拟位置的选项。有时 CLLocation 管理器可以返回例如一个旧的缓存位置,所以也许这就是发生在你身上的事情。在你对收到的 CLLocation 对象做任何事情之前,我建议检查它的 HorizontalAccuracy 和 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 didStartMonitoringForRegion 委托方法