我有一个应用程序,它收集前景和背景中的位置数据。为了节省电池,我想使用allow Apple Doc中所述的allowDeferredLocationUpdatesUntilTraveled属性 从文档中,allowDeferredLocationUpdatesUntilTraveled在前台设置(基于时间和距离)。一旦应用程序进入后台,我们就不会收到定期的位置更新,而是根据allowDeferredLocationUpdatesUntilTraveled接收它们。
我已经实现了以下代码,但延迟不会在后台调用。
#pragma mark - Location Manager
-(void) setLocationManager
{
locationManager = [[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.delegate = self;
[locationManager startUpdatingLocation];
}
-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"didUpdateLocations");
if (!deferringUpdates)
{
CLLocationDistance distance = 200;
NSTimeInterval time = 60;
[locationManager allowDeferredLocationUpdatesUntilTraveled:distance timeout:time];
deferringUpdates = YES;
}
}
-(void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error
{
NSLog(@"didFinishDeferredUpdatesWithError");
}
SetLocationManager在前台调用并正常工作。一旦应用程序进入后台,我仍然会收到常规的位置更新,而不是allowDeferredLocationUpdatesUntilTraveled。
我还在info.plist文件中设置了以下值 背景提取 后台位置更新 设备功能 - 位置服务
实施此任何人都有好运吗?
答案 0 :(得分:1)
你需要在didFinishDeferredUpdatesWithError中将deferringUpdates设置回NO:根据Apple文档,每次调用时,“委托的locationManager:didFinishDeferredUpdatesWithError:方法被称为一次”(allowDeferredLocationUpdatesUntilTraveled)。
因此,只有在deferringUpdates为NO时才调用allowDeferredLocationUpdatesUntilTraveled。