我有一种非常奇怪的行为。我正在编写一个使用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?
提前致谢。
答案 0 :(得分:2)
您只能使用模拟器位置菜单中的“高速公路驾驶”选项模拟模拟器上的重大变化位置。它将以几分钟的间隔触发。
答案 1 :(得分:0)
在主线程上分配管理器并检查管理器或应用程序是否始终具有权限。 Apple的文档说明是:
注意:重大更改位置更新需要授权 kCLAuthorizationStatusAuthorizedAlways的状态。
您可以使用以下方式检查状态:
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
也许
if (status != kCLAuthorizationStatusAuthorizedAlways)
您可以再次申请权限。