CoreLocation перестает работать в фоновом режиме через определенное время

Я разрабатываю приложение iOS (7.0+) для фитнеса (бега), которое использует местоположение пользователя GPS, выполняет небольшой расчет и передает данные на часы Bluetooth Low Energy (4.0). Этот процесс должен происходить в фоновом режиме, даже когда пользователь блокирует свое устройство iOS.

Я также реализовал следующие фоновые режимы:

 App communicates using CoreBluetooth
 App registers for location updates

Мне удалось заставить все работать хорошо, за исключением того, что через определенное время (например, 2 часа), когда устройство заблокировано, устройство iOS перестает обновлять местоположение, потому что я вижу, что оно больше не отправляет обновление Значения GPS для часов Bluetooth. Затем мне нужно разблокировать устройство, снова открыть приложение, и службы определения местоположения снова работают должным образом.

Кто-нибудь знает, как поддерживать работу служб определения местоположения все время в фоновом режиме (устройство заблокировано) без внезапной остановки обновлений местоположения через определенное время? Если возможно, предпочтение отдается эффективному решению, которое не разряжает аккумулятор слишком сильно, по сравнению с обычным использованием GPS.


person Teddy13    schedule 19.08.2014    source источник
comment
У iPhone недостаточно большой аккумулятор, чтобы точно отслеживать ваше местоположение в течение длительного периода времени. Все, что пытается сделать это, считается ошибкой, поэтому приложение закрывается. Если вы отправите свое приложение как есть, вам, вероятно, будет отказано в соответствии с правилом 13.2 из-за значительного разряда батареи, что может привести к выходу из строя батареи в течение гарантийного периода Apple.   -  person Abhi Beckert    schedule 22.08.2014
comment
Эта проблема была несколько исправлена ​​в iPhone 5S с новым сопроцессором M7, который имеет минимальный расход заряда батареи, но также не обеспечивает такого же уровня детализации, поэтому, возможно, он бесполезен для вашего приложения.   -  person Abhi Beckert    schedule 22.08.2014
comment
Приложения @Abhi не закрываются только потому, что они используют местоположение в течение длительного времени. У нас в магазине есть приложения, которые могут успешно собирать трек в течение многих часов с точками с интервалом в 1 секунду.   -  person progrmr    schedule 22.08.2014
comment
FWIW, что определенное количество времени составляет 17 минут. Если вы установите pausesLocationUpdatesAutomatically на false, то он не остановится   -  person Honey    schedule 23.09.2018


Ответы (1)


Самое главное: убедитесь, что вы устанавливаете pausesLocationUpdatesAutomatically на NO перед запуском CLLocationManager (см. документы).

Чтобы свести к минимуму использование батареи, вы также должны использовать отложенные обновления местоположения (подробнее о SO). Это позволяет ЦП спать и экономить заряд батареи, в то время как чип GPS собирает для вас обновления местоположения. Он периодически сбрасывает их на процессор. Это может быть не для вас, если вам нужно обновлять часы раз в секунду, но если вы можете обновлять их каждые 10, 20 или 30 секунд, это сэкономит столько пробуждений процессора.

person progrmr    schedule 22.08.2014
comment
Просто чтобы быть кристально чистым в этом. Я думал, что deferred откладывается примерно на 5-30 минут. Но вы просто говорите, что это будет отложено максимум до 30 секунд?! Можете ли вы уточнить? - person Honey; 23.09.2018
comment
1) Просто чтобы быть предельно ясным в этом вопросе. Я думал, что deferred откладывается примерно на 5-30 минут. Но вы просто говорите, что это будет отложено максимум до 30 секунд?! Можете ли вы уточнить? 2) И какое минимальное время ожидания вы должны установить, чтобы сэкономить заряд батареи? - person Honey; 23.09.2018
comment
Я никогда не говорил максимум, 30 секунд было просто примером. Отсрочка на 10 минут (600 секунд) сэкономит много пробуждения ЦП по сравнению с пробуждением ЦП один раз в секунду. - person progrmr; 25.09.2018