У меня очень похожее требование: мое приложение должно делать высокоточные снимки местоположения с периодическим интервалом (обычно 1 минута), и оно должно делать это, даже если устройство находится в спящем режиме или приложение находится в фоновом режиме.
Для достижения этой цели на переднем плане я реализовал систему, которая включает службу определения местоположения, ожидает определения местоположения с требуемой точностью, а затем отключает службу до срабатывания таймера.Этот процесс повторяется и, кажется, работает должным образом: полдюжины неточных показаний местоположения возвращаются (в течение нескольких секунд) до получения точного.
Тестирование показало, что этот подход будет работать, когдааппарат спит, что меня удивило!Так что теперь нам просто нужно позаботиться о том, когда приложение будет фоновым.
Вот механизм, который я использую, чтобы расширить его до сбора данных в фоновом режиме:
Установите значение info.plistчтобы указать, что обновления местоположения необходимы приложению, даже если не на переднем плане.Это описано в разделе «Отслеживание местоположения пользователя» документации Apple SDK.Это гарантирует, что обновления местоположения будут доставлены в приложение даже в фоновом режиме или в спящем режиме.
Однако этот подход не допускает (из коробки) периодический сбор, а вместо этого уведомления отправляются всякий раз, когдаслужбы определения местоположения видят изменение местоположения, как определено желаемым значением точности.
К сожалению, если вы отключите сбор данных служб определения местоположения после того, как приложение станет фоновым, оно больше не будет получать уведомления (приложение находится в фоновом режиме, помните?).Поэтому я исследую использование метода setKeepAliveTimeout: handle в UIApplication, чтобы ТАКЖЕ выполнять периодическую проверку, эффективно заменяя мой таймер переднего плана.[Примечание - чтобы зарегистрировать обработчик KeepAlive, вы также должны установить info.plist, чтобы указать, что приложение выполняет VOIP] Когда вызывается обработчик KeepAlive, он включает службы определения местоположения в обработчике, собирает данные, а затем отключает службы определения местоположения.,Тестирование показало, что это перезапускает уведомления служб определения местоположения.Но я вижу, что обработчик KeepAlive вызывается только с 10-минутными интервалами (600 секунд), и я не уверен, достаточно ли это хорошо.
Обратите внимание, что метод setKeepAliveTimeout: handle предназначен для приложений VOIP,и, видимо, Apple очень внимательно изучает приложения, которые его используют.В моем случае это приложение для клиента, который использует Wireless Distribution, а не магазин Apple, поэтому для меня это не проблема.
Однако, если этот подход работает, он, кажется, удовлетворяет неудовлетворенную потребностьс помощью Apple API: уравновешивание необходимости высокоточных данных о местоположении, при этом собирая эти данные только с интервалами, чтобы продлить срок службы батареи.Apple действительно должна поддерживать модель сбора по времени, а не только на основе точности.Ах, хорошо!
Приветствия