我正在编写一个应用程序,需要与 高精度低频率的后台位置更新。解决方案似乎是一个后台 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秒减少到零(同时记录位置) ,然后执行到期处理程序,不再生成进一步的位置更新。如何修改以上代码以接收 定期在后台更新位置?
更新 : 我的目标是 iOS7,并且有证据表明后台任务的行为是不同的: