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没有这个)。

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

4

4 回答 4

5

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

于 2012-12-16T04:46:42.680 回答
1

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

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

- (void) actualTask {
    NSLog("Currently at: %@", MyLocationManager.location.coordinate);
}
于 2012-12-16T03:54:32.250 回答
0

我想如果你在建筑或复杂的话didUpdateLocations就不会打电话了。如果您可以进行实时测试,例如在设备上进行构建,则只需移动到开放空间,以便 GPS 可以获取数据,您将收到数据。如果你走路那么它也不会经常得到didUpdateLocations。您必须在汽车/公共汽车或自行车上进行测试。

于 2016-06-15T11:27:26.357 回答
0

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

于 2017-05-03T12:33:37.770 回答