startMonitoringSignificantLocationChanges但是在一段时间之后不再调用didUpdateLocations

时间:2013-09-20 14:32:11

标签: iphone ios objective-c core-location

我有一种非常奇怪的行为。我正在编写一个使用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?

提前致谢。

2 个答案:

答案 0 :(得分:2)

您只能使用模拟器位置菜单中的“高速公路驾驶”选项模拟模拟器上的重大变化位置。它将以几分钟的间隔触发。

答案 1 :(得分:0)

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

  

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

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

CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

也许

if (status != kCLAuthorizationStatusAuthorizedAlways)

您可以再次申请权限。