如何判断 CLLocationManager 是否在监控重要的位置变化

How to tell if CLLocationManager is Monitoring Significant Location Changes

我正在更新一个应用程序,该应用程序使用 CLLocationManager 监控用户位置的重大变化。我允许用户打开或关闭此选项,适当地设置 startMonitoringSignificantLocationChanges 和 stopMonitoringSignificantLocationChanges。

问题是当用户重新打开应用程序时,我需要知道该应用程序当前是否正在监视重要位置,以便相应地设置此切换的当前状态。

有什么我可以在 CLLocationManager 或其他地方检查的东西,告诉我监控当前是打开还是关闭。

在iOS8中,您可以查看当前从用户那里获得的权限。如果用户授予您 Always 权限,则意味着他们允许进行重大位置更改。如果他们只允许 WhenInUse,则不允许显着的位置更改。请参阅 this post 详细了解您在这两个位置权限上获得的内容。

在 iOS 8 之前,我不相信有什么方法可以说明这一点。用户可以允许或不允许您使用他们的位置。因此,您需要自己跟踪位置管理器的当前状态(即 NSUserDefaults 中的 BOOL 在您调用 startMonitoringSignificantLocationChanges 时更改为 YES,并设置当您调用 stopMonitoringSignificantLocationChanges).

时,它变为 NO

因此,部分原因是 CLLocationManager 的这个令人讨厌的限制,我最终放弃了使用 Significant Location Changes 以支持监视区域。这样做的好处是比在手机信号塔发生变化时随机获取位置更准确,而不会大量耗尽电池电量,但更重要的是,您可以询问位置管理器它当前正在监视哪些区域,从而了解它是打开还是关闭.

您可以像显着位置变化一样使用它,因为您可以设置一个区域,该区域是您当前位置周围的半径,然后在您的 didExitRegion 回调中,获取正确的 GPS 信号并使用该位置.