Подтвердить что ты не робот

Обновления CoreMotion в фоновом состоянии

С микросхемой M7 на новейших устройствах iOS можно получить программную информацию, поскольку пользователь переходит от стационарной к бегу, ходьбе и т.д., используя CMMotionActivityManager. Stava и Runkeeper использовали это для автоматического приостановки GPS-опроса (отключите антенну GPS), когда он обнаруживает, что пользователь не перемещается через M7, а затем снова включить обновления GPS после их повторного перемещения. Он может сделать это, пока приложение находится в фоновом состоянии, которое является ключевым здесь.

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

Если я оставлю GPS все время, я продолжу получать обновления движения от Core Motion все время, когда приложение находится в фоновом режиме.

Я предполагаю, что они не играют на белом шуме или другом дешевом трюке, чтобы оставаться активным. Как они это сделали?

4b9b3361

Ответ 1

RunKeeper фактически использует звуковой трюк, чтобы не спать. Если вы откроете пакет приложений и проверьте их Info.plist, вы увидите, что он регистрируется в фоновом режиме звука. Вот как они снимают периодические звуковые уведомления о вашем расстоянии, скорости и темпе. Это также то, как они бодрствуют во время вашего прогона, одновременно сводя к минимуму утечку аккумулятора.

Если вы заметили, что значок службы местоположения (треугольник в строке состояния) полностью исчезает при использовании RunKeeper, то они определенно не используют отслеживание местоположения какого-либо типа для выполнения фона. Даже активизация геообъектов и значительный мониторинг изменения местоположения приведут к появлению значка служб местоположения.

Они также не используют M7, чтобы не спать, потому что это не работает. Обновление от API-интерфейсов CoreMotion, связанных с M7, не пробудит ваше приложение из-за сна. Когда приложение начнет просыпаться, они смогут запросить историю движения и истории шагов и, возможно, попытаться что-то вычислить, но я сомневаюсь, что все будет так точно.

Наконец, вы должны отметить, что API-интерфейсы Auto-pause были представлены в iOS 6 перед выпуском чипов iPhone 5 и M7. Это ортогональные понятия.

Ответ 2

Что я заметил при выключении GPS, приложение не будет выполнять какой-либо код в фоновом режиме для iOS 7, приложение выглядит как неактивное состояние. Поэтому при перемещении в фоновом режиме используйте startMonitoringSignificantLocationChanges, а также получите обновления от своего менеджера местоположений. Средство одновременного использования используется как сервис startUpdatingLocation при изменении состояния пользователя, так и startMonitoringSignificantLocationChanges в фоновом режиме.

Итак, когда пользователь включит GPS, в то время как вы использовали startMonitoringSignificantLocationChanges, ваше приложение получит

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

Лучше проверьте здесь, в фоновом режиме, что неправильно с CoreMotion Framework. И попробуйте перезапустить его. Поскольку в чип-устройстве M7 я могу читать данные акселерометра в этом случае.

Ответ 3

Вы считаете, что экспериментируете с

application:performFetchWithCompletionHandler: 

в делегате приложения? Вы не можете контролировать, как часто это называется, но в зависимости от приложения это может быть каждые ~ 15 минут. Затем вы можете запустить CMMotionActivityManager, чтобы запросить результаты M7.

Не совсем понятно, какую функциональность вы пытаетесь реплицировать, но чип M7 записывает всю активность, независимо от того, работает ли ваше приложение. Таким образом, вы можете просто запросить в фоновом режиме и обновить итоговые значения шага или типы активности.

Ответ 4

Если ваш менеджер местоположений работает в активном режиме, чтобы включить фоновый режим, вам нужно выполнить следующие три действия:

  • Убедитесь, что включено [Target/Capabilities/Background Modes/Location updates].
  • [locationManager requestAlwaysAuthorization];
  • locationManager.allowsBackgroundLocationUpdates = YES;

Ответ 5

Сначала проверьте, настроено ли ваше фоновое поведение вашего приложения.

Перейдите в раздел целевых возможностей и проверьте фоновый режим для обновлений местоположения.

XCode Capabilities