Xamarin - IOS - CLLocationManager - Таймер останавливается, когда телефон переходит в режим сна - PullRequest
0 голосов
/ 27 апреля 2018

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

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

Это работает довольно хорошо, если телефон не спит или приложение находится в фоновом режиме. Когда телефон переходит в режим сна, таймер останавливается. Есть ли способ избежать этого? я думал, что, возможно, поскольку я прекращаю обновления местоположения, IOS считает, что приложение больше не разрешено в фоновом режиме, поэтому оно останавливает выполнение всего кода, но на самом деле я понятия не имею, что происходит. У кого-нибудь есть подсказка?

Редактировать: я протестировал приведенное ниже решение от Михала, и оно работает как шарм. Даже если таймер истекает через 15 секунд, эффект от батареи велик. Мое приложение использовало 50% батареи за несколько часов. Теперь он даже не потребляет 5%.

Вот последовательность, которую я использую:

  1. Создание LocationManager и настройка его работы в фоновом режиме с наилучшей точностью
  2. Когда прибывает первое исправление GPS, установите точность в 3 километра и запустите таймер, который истекает через 15 секунд
  3. Когда отметится таймер, верните точность обратно к лучшему и загрузите на сервер все полученные местоположения.

1 Ответ

0 голосов
/ 27 апреля 2018

Взгляните на эту страницу документации Apple: pausesLocationUpdatesAutomatics . Он описывает, что вы можете приостановить обновления местоположения, а затем возобновить его. Если это все еще не решит вашу проблему, тогда есть дополнительное примечание:

Для приложений, имеющих авторизацию, используется пауза для обновления местоположения прекращает доступ к изменениям местоположения, пока приложение не будет запущено снова и возможность перезапустить эти обновления. Если вы не хотите обновления местоположения полностью остановиться, рассмотрите возможность отключения этого свойства и изменения местоположения Точность до kCLLocationAccuracyThreeKilmeters, когда ваше приложение перемещается в фон. Это позволяет вам продолжать получать местоположение обновления в удобной для пользователя форме.

Может быть, вы можете использовать этот совет и сделать следующее:

1) Начните с установки точности в соответствии с вашими потребностями ( NearestTenMeters )

2) Когда придет обновление местоположения, обработайте его, установите точность местоположения на Три километра , затем установите 15-минутный таймер, после которого вы должны изменить точность обратно на NearestTenMeters

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...