startMonitoringSignificantLocationChanges但是过了一段时间后再也没有调用过更新位置

我有一种非常奇怪的行为。 我正在编写一个同时使用fetch和location background模式的应用程序(不知道它对于这个问题很重要)。 我使用委托正确设置了CLLocationManager,并开始监视AppDelegate中的重要位置更改( startMonitoringSignificantLocationChanges )。 我立刻得到了一个名为didUpdateLocations的函数,它给了我一些位置。 之后,即使我在Xcode中模拟不同的位置(也使用GPX文件),甚至停止并重新启动监控,也不会再触发事件。 我在后台和前台都没有收到任何位置。

奇怪的是,如果我开始更新位置(使用GPS),它可以正常工作(进行相同的测试……开始和停止与startMonitoringSignificantLocationChanges完全一样)。 显然我有didUpdateLocations和didFailWithError(我没有收到任何错误)。

这是我的初始化(通过在我的AppDelegate didFinishLaunchWithOptions中初始化对象来调用):

self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.pausesLocationUpdatesAutomatically = NO; 

我知道distanceFilter和准确性对于重要的位置变化并不重要,我已经将pausesLocationUpdatesAutomatically设置为NO。

我错过了什么吗? 并且确实存在一种方法来读取一个位置是否来自wifi,蜂窝或gps?

提前致谢。

您可以使用模拟器位置菜单中的“高速公路驱动”选项模拟模拟器上重大更改的位置。 它将以几分钟的间隔触发。

在主线程上分配管理器,并检查管理器或应用程序是否始终具有权限。 Apple的文档说明是:

注意:重大更改位置更新需要授权状态为kCLAuthorizationStatusAuthorizedAlways。

您可以使用以下方式检查状态:

 CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 

有可能

 if (status != kCLAuthorizationStatusAuthorizedAlways) 

您可以再次请求权限。