我正在编写一个需要高精度低频率后台位置更新的应用程序。解决方案似乎是启动位置管理器更新的后台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,并且有一些证据表明后台任务的行为有所不同:
在后台任务中启动位置管理器(iOS 7)