didUpdateLocations продолжает вызывать каждую секунду с отложенными обновлениями
Я пытаюсь реализовать отложенные обновления местоположения, чтобы иметь лучшее потребление батареи. Я начинаю свой менеджер местоположения, как это:
- (void)initCoreLocation
{
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.pausesLocationUpdatesAutomatically = YES;
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
//Très important pour iOS9 !
if ([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
self.locationManager.allowsBackgroundLocationUpdates=YES;
}
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
[self.locationManager startUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
}
И запустить отложенное обновление следующим образом:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
if (!self.deferringUpdates) {
[self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:30];
self.deferringUpdates = YES;
}
}
-(void)locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error { // Stop deferring updates
if(error) {
NSLog(@"error");
}
NSLog(@"didFinishDeferredUpdates");
self.deferringUpdates = NO;
}
я имею didFinishDeferredUpdates
Журнал каждые 30 секунд, однако didUpdateLocations
продолжает звонить каждую секунду, убирая любые попытки оптимизировать расход батареи. Предполагается ли диспетчеру местоположения позвонить didUpdateLocations
каждые 30 секунд?
3 ответа
Вы отлаживаете?
Как указано в ответе здесь: отложенные обновления местоположения ios не могут быть отложены
Отложенные обновления доставляются только тогда, когда система переходит в состояние низкого энергопотребления. Отложенные обновления не происходят во время отладки, потому что XCode препятствует тому, чтобы Ваше приложение спало и таким образом препятствует тому, чтобы система вошла в то состояние низкого энергопотребления.
Может быть, у вас нет правильного подхода, как allowDeferredLocationUpdatesUntilTraveled()
приказывает оборудованию GPS хранить новые местоположения внутри до тех пор, пока не будут соблюдены указанное расстояние или время ожидания.
Из библиотеки разработчиков iOS:
Если ваше приложение находится на переднем плане, диспетчер местоположений не откладывает доставку событий, но отслеживает указанные критерии. Если ваше приложение переходит в фоновый режим до того, как критерии будут выполнены, менеджер местоположения может начать откладывать доставку событий. Ссылка на сайт
Я считаю, что вам нужен только один из них одновременно, измените вызов в applicationDidEnterBackground
а также applicationWillEnterForeground
- (**void)applicationDidEnterBackground:(UIApplication *)application {
// Need to stop regular updates first
[self.locationManager stopUpdatingLocation];
// Only monitor significant changes
[self.locationManager startMonitoringSignificantLocationChanges];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
[self.locationManager stopMonitoringSignificantLocationChanges];
[self.locationManager startUpdatingLocation];
}