我正在编写一个需要高精度和低频率的后台位置更新的应用程序。解决方案似乎是一个后台 NSTimer 任务,它启动位置管理器的更新,然后立即关闭。之前有人问过这个问题:
如何在我的 iOS 应用程序中每 n 分钟更新一次后台位置?
但我还没有得到一个最低限度的例子。在尝试了上述接受的答案的每一种排列之后,我把一个起点放在一起。进入后台:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self.locationManager
selector:@selector(startUpdatingLocation)
userInfo:nil
repeats:YES];
}
和委托方法:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
当前的行为是backgroundTimeRemaining
从 180 秒递减到零(在记录位置时),然后执行到期处理程序并且不会生成进一步的位置更新。如何修改上述代码以无限期地在后台接收定期位置更新?
更新:我的目标是 iOS 7,似乎有一些证据表明后台任务的行为不同: