didUpdateToLocation不叫第二次

问题描述:

在我们的应用程序中,我使用CoreLocation来获取用户的位置。我认为对startUpdatingLocation的调用每次都会调用locationManager:didUpdateLocations。但一旦第一次接到电话,他们就再也不会接到电话了。didUpdateToLocation不叫第二次

在我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]; 
} 

上面的代码应该调用startUpdatingLocation每隔15秒,但didUpdateToLocation方法没有得到所谓的第二次(第一个成功叫...)。

有没有办法通过“编程方式”调用(或强制)didUpdateToLocation?或者我们必须等到didUpdateToLocation获取位置?我已经搜索了每个x分钟/秒获取用户位置的方式,但似乎没有人成功实现该目标。我想要做的仅仅是Android如何使用Service类来实现它(iOS没有这个)。

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

+0

你有没有这方面的任何解决方案?我现在有同样的问题。但其更新只有五次。之后,它自己停止。在模拟器中,它的工作正常。请帮助我。 – sathiamoorthy

+0

嗨。不幸的是,我的问题仍然没有“坚实”的解决方案。我不知道它是否可以帮助,但在你的情况下,也许操作系统杀死你的逻辑后台任务超时?我曾经有过这样的情况,当我忘记检查信息设置中的“所需的背景模式”... –

+0

我得到了我的问题的解决方案。在iOS6中,我们应该使用“didUpdateLocations”而不是“didUpdateToLocation”。这是什么问题。现在工作正常。 – sathiamoorthy

嗯。一旦你开始更新位置,它会继续。根据您选择的准确度,几乎不间断,因此不需要继续启动它。它将等待与您的准确性相匹配的重大位置更改......它会为您处理所有这些效率和功耗优势。您是否尝试过使用模拟器并选择驾驶路线选项?它可以帮助你更多地理解它的动作(只启动一次)。

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

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

谢谢你的回复!实际上,一旦确定了位置,我会在didUpdateToLocation内调用stopStandardUpdates。因此我不得不继续启动startStandardUpdates。这也是有额外的背景剩余时间。我也尝试在模拟器中的高速公路驾驶模式,但仍然无法在第一次更新后收到didUpdateToLocation ... –

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

+0

感谢您的回复!所以它与当前的位置有关?如果是这样,在模拟器中的高速公路驾驶模式应该工作,并可能调用didUpdateToLocation? –

我认为如果你在建设或复杂,那么didUpdateLocations将不会被调用。如果您可以实时测试就像在设备上搭建一样,只需移动到开放空间,以便GPS可以获取数据并且您将收到数据。如果你走路,那么它也不会频繁地得到didUpdateLocations。你必须在汽车/公共汽车或自行车上进行测试。

在你的代码,更改distancefilter=10kCLDistanceFilterNone