为什么 didUpdateLocations: 在 locationManager DidResumeLocation Updates 之后只有一个位置:

Why does didUpdateLocations: only have one location after locationManagerDidResumeLocationUpdates:

我在 iOS8 中使用定位服务。

设置为 kCLLocationAccuracyBest,使用 startMonitoringSignificantLocationChanges 在后台重新启动,startUpdatingLocation 用于准确性。

当我设置 pausesLocationUpdatesAutomatically = YES 时,定位服务会按预期暂停和恢复。但是,下面对 didUpdateLocations: 的调用只有一个位置。

我原本希望收到 OS 在传送暂停时收到的一堆位置信息。我在这里错过了什么吗?跟deferredLocationUpdatesAvailable有关系吗?

这个 answer 在 Apple Dev Forum 上讨论了一个 post,但是我在搜索 pausesLocationUpdatesAutomatically 时什么也没有得到。

请注意:此问题与调用requestAlwaysAuthorization或在info.plist中设置提示无关。

当您暂停位置更新时,系统认为您暂时不需要该位置。恢复它只会给你当前位置。
这是正常现象。

...

进一步回答

pausesLocationUpdatesAutomatically 的文档指出:

Allowing the location manager to pause updates can improve battery life on the target device without sacrificing location data.

这是高度误导

真正的意思是when location manager pauses it will sacrifice location data: the app does not get and never will get location updates until the location manager resumes.

应该说明暂停位置更新与延迟位置更新完全不同。

为了延长电池寿命,应用程序应调用 allowDeferredLocationUpdatesUntilTraveled:timeout:,它会在延迟到 locationManager:didUpdateLocations: 时提供收集到的所有位置更新。

locationManager:didUpdateLocations: 的文档指出:

If updates were deferred or if multiple locations arrived before they could be delivered, the array may contain additional entries.

这是相当清楚的,但它可以声明它与 pausesLocationUpdatesAutomatically.

无关,不应混淆