我正在编写一个需要高精度和低频更新背景位置的应用程序。解决方案似乎是后台NSTimer任务,该任务启动位置管理器的更新,然后立即关闭。曾有人问过这个问题:
但是我还没有一个起码的例子。在尝试了上述公认答案的所有排列之后,我提出了一个起点。输入背景:
- (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,并且似乎有一些证据表明后台任务的行为有所不同: