为什么当我在飞行模式下启动应用程序时,位置管理器 returns 在“locationManager:didUpdateLocations:”中的位置?

why location manager returns a location in " locationManager:didUpdateLocations: " when I start the app in airplane mode?

如果我在飞行模式下启动我的应用程序,我预计我的委托位置管理器对象会失败,因为它应该是不可访问的。

然而,方法 "locationManager:didUpdateLocations" 被调用,并给出了一个位置,但似乎有一些内部对象 "nil"。

当传递和使用位置对象时,整个事情会导致崩溃。 如果设备处于飞行模式并调用方法 "locationManager:didFailWithError:",我不应该收到修复错误吗?

如果应用程序已经在运行,则不会发生这种情况。

只是为了那些会问同样问题的人(可以在 Whosebug 上的其他地方以不同的方式找到),CLLocationManager 有一个内部缓存,它会在一段时间后过期。 这意味着如果你进入飞行模式并询问位置,位置管理器会向你发送它修复的最新信息,直到它在几分钟后(将近 30 分钟)清除缓存,然后它会给出位置错误。

小米崩溃是因为其他原因,所以返回的对象正常。

如果您想确保修复在您要求时准确完成,可以在 cllocation 对象上有一个 "timestamp" 属性 可以与 [NSDate date] 进行比较以了解如果返回的位置是 "fresh" 或已缓存。

仅供参考,在设备 运行 iOS 8.3 或更高版本中,启用飞行模式时不会禁用 GPS。