【问题标题】:didUpdateToLocation not called second timedidUpdateToLocation 未第二次调用
【发布时间】:2012-12-03 14:32:31
【问题描述】:

在我们的应用中,我使用 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没有这个)。

任何帮助将不胜感激。
谢谢。

【问题讨论】:

  • 您对此有什么解决方案吗?我现在有同样的问题。但它只更新了五次。之后,它会自行停止。在模拟器中,它工作正常。请帮助我。
  • 嗨。不幸的是,我的问题仍然没有“可靠”的解决方案。我不知道它是否有帮助,但在你的情况下,操作系统可能会因为后台任务超时而杀死你的逻辑?我曾经遇到过忘记在信息设置中检查“必需的背景模式”的情况......
  • 我找到了解决问题的方法。在 iOS6 中,我们应该使用“didUpdateLocations”而不是“didUpdateToLocation”。那是什么问题。现在工作正常。
  • 很高兴你解决了你的问题 :) 我也遇到了这个问题,并问了一个关于它的问题......不管怎样,继续努力,好好编码!

标签: ios core-location cllocationmanager cllocation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为,如果您在建筑物或综合体中,那么didUpdateLocations 将不会被调用。如果您可以进行实时测试,例如在设备上进行构建,只需移动到开放空间,以便 GPS 可以获取数据,您将收到数据。如果你走路那么它也不会经常didUpdateLocations。您必须在汽车/公共汽车或自行车上进行测试。

    【讨论】:

      【解决方案3】:

      _locationManager.distanceFilter=10; 您的距离过滤器设置为 10m,您将不会收到通知。一旦位置移动到足以超过您的距离过滤器设置,那么您将收到 didUpdateToLocation 回调...

      【讨论】:

      • 感谢您的回复!那么它与当前位置有关吗?如果是这样,模拟器中的高速公路驾驶模式应该可以工作并调用 didUpdateToLocation 吗?
      【解决方案4】:

      嗯。一旦你开始更新位置,它就会开始。根据您选择的精度,几乎不间断,因此无需继续启动它。它将等待与您的准确性相匹配的重大位置更改……它会为您处理所有这些效率和功率权衡问题。您是否尝试过使用模拟器并选择行车路线选项?它可能会帮助您更好地了解它的动态(只启动一次)。

      如果您只是需要它每 15 秒发送一次 ping,那么可能开始更新...然后只需在计时器中每 15 秒读取一次当前位置/航向?

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

      【讨论】:

      • 感谢您的回复!实际上,一旦确定了位置,我就会在 didUpdateToLocation 中调用 stopStandardUpdates 。因此我不得不继续启动 startStandardUpdates。这也是为了有额外的背景剩余时间。我也试过模拟器里的高速公路驾驶模式,但第一次更新后还是收不到didUpdateToLocation...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多