Я создаю трекер активности, похожий на приложение «Moves», которое отслеживает шаги, расстояние, калории и время активности.
Для устройств Iphone5s + я использую встроенный чип M7 для определения шагов, а затем делаю на их основе оценки. Для устройств M7 никогда не использую GPS. Практически нет разряда батареи, и интерполированные числа достаточно разумны для необходимости. Это достаточно разумно для получения данных о ходьбе / беге.
Однако для поддержки хотя бы Iphone5 и Iphone4 мне нужно использовать GPS для определения местоположения, а затем интерполировать шаги и калории на расстоянии. Я сталкиваюсь со значительными проблемами разряда батареи (отчасти ожидаемыми), и я ищу совета, как это минимизировать. Я также использую акселерометр в дополнение к скорости, чтобы сделать обоснованное предположение о типе активности (ходьба, бег, езда на велосипеде, транспорт).
Некоторые вещи, которые я пробовал для оптимизации GPS:
- Отложенные обновления: Iphone5 и минимальная версия IOS поддерживают это. Код для этого прост, однако остается под вопросом, действительно ли устройство его использует. Я видел, как он работает только на 1 из 4 устройств, где работает регулярно. Еще 3 устройства никогда не откладывали обновления из того же кода. Другой пользователь предложил другие приложения, предотвращающие переход устройства в спящий режим, в том числе, когда у меня также была установлена функция «Moves». Таким образом, помимо теории, это не помогло.
- Уменьшить точность: снизить точность непрерывного опроса местоположения. Я начал с высокого уровня, но затем сократился до 10 метров, затем до сотен метров и т. Д. Это, похоже, не помогает, и в любом случае опрос все равно происходит с регулярным интервалом.
- startMonitoringSignificantLocationChanges: чтобы уменьшить количество бесконечных опросов GPS, когда пользователь может не двигаться в течение нескольких часов (особенно ночью), я переключился с непрерывного опроса на значительные изменения только после того, как устройство перестало двигаться в течение произвольные 2 минуты. Затем я снова включаю непрерывное отслеживание после любого значительного обновления местоположения. Это работает почти так, как ожидалось - если отслеживание прекращается, разрядка батареи замедляется, а когда она возобновляется непрерывно, разрядка батареи возобновляется. Кроме того, если пользователь начинает ходить, в течение некоторого времени нет гарантии значительного движения. Это очень плохо для точности. Иногда кажется, что это вообще не возобновляется.
Я был относительно впечатлен тем, что приложение «Moves», среди прочего, может так хорошо отслеживать местоположение при приличном разряде батареи. Он может работать большую часть дня, пока не потребуется подзарядка. С моим кодом пользователи сообщают о полном разряде батареи за пару часов.
Какие оптимизации можно было бы использовать, чтобы улучшить это, но при этом сохранить разумную точность отслеживания движения?
ПРОЦЕСС ОБНОВЛЕНИЯ: startMonitoringSignificantLocationChanges. Я установил это с помощью таймера, который переключается на значительный мониторинг после 2 минут бездействия (без движения). Затем обычное отслеживание местоположения возобновляется снова при любом значительном изменении или когда приложение становится активным после повторного открытия. Кажется, это хорошо работает. Мой телефон все еще переходит со 100% до 10% за 8 часов без дела. Это старый iphone с некоторыми проблемами с аккумулятором, но обычно он может просто потерять 30-40% незаряженной за ночь без запущенных приложений. Мне нужно протестировать больше, но startMonitoringSignificantLocationChanges по-прежнему использует некоторую батарею.
Кроме того, startMonitoringSignificantLocationChanges имеет некоторые ожидаемые проблемы с точностью с точки зрения того, когда он перезапускает приложение. В сельской местности он может проехать несколько километров до повторного запуска. Это могло бы быть нормально для долгой езды, но если я хочу поймать 30-минутную прогулку, я могу ее полностью пропустить. В городских условиях кажется, что это срабатывает в пределах 2-3 кварталов движения, что разумно.
Даже если бы я использовал непрерывное отслеживание местоположения, которое остановлено + запускалось по таймеру для проверки движения, у меня все равно, вероятно, будет наихудший случай задержки в минуту между перезапусками перед возобновлением непрерывной регистрации.
ПРОГРЕССНОЕ ОБНОВЛЕНИЕ 2:
Существенные обновления, описанные выше, имеют для меня фатальный недостаток: они не всегда запускаются достаточно быстро. Иногда кажется, что это занимает 1-2 мили!
В качестве более подходящего подхода я попытался поддерживать постоянное обновление местоположения, но переключая свойство "желаемой точности" с высокой на низкую точность, когда устройство не движется. По сути, это должно выключить приемник GPS во время бездействия. Я экспериментировал с точностью от 100 до 1 км для бездействия с многообещающими результатами. Кажется, что он использует немного больше теста, чем только при использовании мониторинга значительных изменений, но он также кажется более отзывчивым.