1

我们的 iOS 应用程序的一项要求是在后台监控位置变化。我们已经实现了“locationManager startMonitoringForRegion:region”,不幸的是我们在彻底测试应用程序时意识到它太不精确,无法满足我们的需求。

然后我们使用“locationManager startUpdatingLocation”来提高位置的准确性。在前台一切都很好,这个位置精度几乎是我们想要的。

现在的问题是当应用程序在后台时,不会定期调用事件“didUpdateLocations”。我们通过查看日志文件观察到这一点。发生的事情几乎总是一样的,前 15 分钟应用程序会定期更新位置,然后突然停止。在大约 5 分钟的休息后,它会再次更新位置大约 15 分钟。这继续以同样的方式。

我们可能在后台处理的实现中犯了错误。

UIApplication *app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier bgTask = 0;

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

    if(rootViewController._selectedLocation == nil)
    {
        NSLog(@"selected location is nil and app entered background");
        [rootViewController.locationManager stopUpdatingLocation];
    }
    else
    {
        NSLog(@"selected location is not nil and app entered background");
        [rootViewController.locationManager startUpdatingLocation];
    }
    [app endBackgroundTask:bgTask];

}];

这似乎大约每 20 分钟调用一次,并且位置会再次更新。我们做错了什么,我们如何才能在没有任何中断的情况下定期更新位置?我们用 iPhone 5 进行了测试,知道它是静止的也很重要。

4

1 回答 1

0

您应该将以下值添加到您的应用程序 plist 文件中:

所需的后台模式

它是一个数组,告诉系统您的应用程序在后台需要什么。对于第 0 项的位置,您应该告知值:

应用程序注册位置更新

如有疑问,您可以在此链接中看到我在说什么:iOS Multitasking: Background Location

于 2013-05-31T09:34:29.490 回答