2012-03-04 3 views
1

Чтобы сохранить батарею, я отслеживаю обновления местоположения, чтобы узнать, был ли пользователь неподвижен в течение определенного периода времени; Если это так, я затем понижаю CLLocationManager с его основных настроек kCLLocationAccuracyBestForNavigation и kCLDistanceFilterNone (максимальные настройки) для мониторинга значительных изменений местоположения.Расположение ядра: переключатель startMonitoringSignificantLocationИзменяет вниз от kCLDistanceFilterNone

Проблема в том, что она не работает: после вызова startMonitoringSignificantLocationChanges обновления местоположения продолжают входить с высокой скоростью, как это было до вызова.

Как вы активируете активность, а затем снова создаете резервную копию?

Update: этот код отвечает на вопрос:

 //Set 
     if (shouldMonitorSignificantChangeUpdates) { 
      NSLog(@"Entering -> significant change mode"); 
      [self.locationManager stopUpdatingLocation]; 
      [self.locationManager startMonitoringSignificantLocationChanges]; //aka stop monitoring every location change 
     } else { 
      NSLog(@"Exiting <- significant change mode"); 
      [self.locationManager stopMonitoringSignificantLocationChanges]; //aka begin monitoring every location change 
      [self.locationManager startUpdatingLocation]; 
     } 
+0

Как вы это тестируете? По документации устройство решает, что произошло существенное изменение местоположения путем обнаружения изменения идентификатора ячейки (GSM). Посмотрите также http://stackoverflow.com/questions/8290707/startmonitoringsignificantlocationchanges-lack-of-accuracy –

+0

Да, похоже, что я не позволял башне меняться и поэтому так и не получил обновления, ошибочно полагая, что вся система была отключен. – SG1

ответ

1

На самом деле код под редакцией в вопросе делает работы. Это позволяет системе возвращаться от «постоянного потока местоположений» к «случайным обновлениям» по желанию.

Я думаю, что мое первоначальное тестирование было просто недостаточно агрессивным, и в документах не обсуждалось использование обоих методов, а вместо этого представлялось приложение, которое требует только навигации или значительных изменений.

1

Из документов:

startMonitoringSignificantLocationChanges не полагаться на значения в свойстве distanceFilter генерировать события

Вместо использования startMonitoringSignificantLocationChanges используйте таймер для остановки и начните обновление местоположения.

Вы также можете попробовать отключить обновление местоположения, а затем включить его с помощью startMonitoringSignificantLocationChanges. Не забывайте, что это заставит систему запускать ваше приложение после того, как оно будет прекращено, когда оно обнаружит значительное изменение местоположения. Это не похоже на то, что вы действительно хотите.

+0

Использование таймера обычно является последним средством для любого количества причин. Ваше второе предложение, хотя это в основном то, что я пытался выполнить, и кажется, что код, на самом деле, действительно * делает это. Спасибо. – SG1

Смежные вопросы