第二次未调用didUpdateToLocation

3
在我们的应用程序中,我使用CoreLocation获取用户的位置。我认为调用startUpdatingLocation会每次调用locationManager:didUpdateLocations。但是,一旦第一次调用它,它们就再也不会被调用了。
在我的AppDelegate.m文件中:
- (void) startStandardUpdates {
 if (_locationManager == nil) {
    _locationManager = [[CLLocationManager alloc] init];
    [_locationManager setDelegate:self];
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    _locationManager.distanceFilter = 10;
    [_locationManager startUpdatingLocation];

 } else {
    NSLog(@"[LOCATION]: Location Manager already exists.");
    [_locationManager startUpdatingLocation];
 }
}

然后通过NSTimer调用它:
- (void) startTask {
  NSLog(@"Start task called.");
  [NSTimer scheduledTimerWithTimeInterval:15
                                   target:self
                                 selector:@selector(actualTask)
                                 userInfo:nil
                                  repeats:YES];
}

- (void) actualTask {
  NSLog(@"[TASK]: Starting location service...");
  [self startStandardUpdates];
}  

上述代码应该每15秒调用一次startUpdatingLocation,但是didUpdateToLocation方法第二次没有被调用(第一次成功调用)……有没有办法“编程方式”调用(或强制)didUpdateToLocation?还是我们必须等待didUpdateToLocation获取位置?我已经搜索了如何每x分钟/秒获取用户位置的方法,但似乎没有人成功实现。我想做的就是Android使用Service类的等效操作(iOS没有这个)。任何帮助将不胜感激。谢谢。

你有解决这个问题的方案吗?我现在也遇到了同样的问题。但它只更新了五次,之后就自动停止了。在模拟器中,它运行得很好。请帮助我解决这个问题。 - sathiamoorthy
嗨。很遗憾,我的问题仍然没有“稳定”的解决方案。我不知道这是否有帮助,但在你的情况下,也许操作系统会因为后台任务超时而终止你的逻辑?我曾经遇到过这种情况,当时我忘记在信息设置中勾选“必需的后台模式”... - Faust V
我找到了解决办法。在iOS6中,我们应该使用“didUpdateLocations”而不是“didUpdateToLocation”。这就是问题所在。现在一切正常了。 - sathiamoorthy
很高兴你解决了问题 :) 我之前也遇到过这个问题并提出了一个问题... 无论如何,继续努力,愉快地编码吧! - Faust V
4个回答

5

_locationManager.distanceFilter = 10; 你的距离筛选器设置为10米,因此您将不会收到通知,直到位置移动足够超过距离筛选器设置,然后您将获得didUpdateToLocation回调...


谢谢您的回复!那么这与当前的位置有关吗?如果是,模拟器中的高速公路驾驶模式应该可以工作并调用didUpdateToLocation函数,对吗? - Faust V

1

嗯,一旦你开始更新位置,它就会一直运行,根据你选择的精度,所以没有必要不停地启动它。它会等待符合你精度的重大位置变化... 它会为你处理所有这些效率和功率权衡的事情。你试过使用模拟器并选择驾驶路线选项吗?这可能会帮助你更好地感受它的运动(只需启动一次)。

如果你只需要它每15秒给你一个ping,那么可以开始更新... 然后在计时器中每15秒读取当前位置/方向即可。

- (void) actualTask {
    NSLog("Currently at: %@", MyLocationManager.location.coordinate);
}

谢谢回复!实际上,我在didUpdateToLocation内部调用了stopStandardUpdates一旦位置被确定。因此,我不得不继续启动startStandardUpdates。这也是为了保留额外的后台时间。我还尝试了模拟器中的高速公路驾驶模式,但仍然无法在第一次更新后接收到didUpdateToLocation... - Faust V

0
在您的代码中,将 distancefilter=10 更改为 kCLDistanceFilterNone

0

我认为如果你处于建筑物或复合物中,则不会调用 didUpdateLocations 。 如果你可以实时测试,比如将设备放在建筑物上,然后移动到开阔地区,这样GPS可以获取数据并接收数据。 如果你步行,它也不会频繁获取 didUpdateLocations 。 你必须在汽车/公交车或自行车上进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接