Непрерывный акселерометр обновляется в фоновом режиме на iOS
Я тщательно изучил эту тему, прежде чем задавать вопрос, но должен убедиться, что я пришел к правильным выводам, и если это так, я хотел бы помочь в максимально возможной реализации этого.
Для моего приложения важно получать обновления акселерометра каждые 5 секунд или, возможно, быстрее в определенных ситуациях; без этой функции, это не очень полезное приложение.
Итак, как добиться этого? Основная стратегия заключается в использовании метода:
[cmMotionManager startDeviceMotionUpdatesToQueue:...]
с соответствующим deviceMotionUpdateInterval
, а затем как-то "убедитесь, что ваше приложение никогда не приостанавливается, т.е. вам необходимо реализовать один из фоновых режимов (например, местоположение, фоновое аудио, VOIP и т.д.)
Эта стратегия используется многими приложениями уже в магазине приложений, такими как Sleep Cycle ( "звукозапись" ), Nike + и Pacer (воспроизведение звука).
(Исправьте меня, если есть другой способ непрерывно получать информацию о акселерометре)
Моя проблема в том, что мое приложение не будет записывать звук, не нуждается в VOIP и т.д. и не требует какого-либо нового API fetch/remote уведомлений в iOS 7. Итак, как сделать, чтобы убедиться, что я остаюсь активен в фоновом режиме?
Ну, так как я разрабатываю приложение, которое измеряет движение, его не так много, чтобы получить информацию о местоположении. Мой вопрос заключается в том, как сделать обновление местоположения наиболее эффективным способом, учитывая тот факт, что мне действительно не нужны эти обновления местоположения на всех, гарантируя, что мое приложение никогда не будет приостановлено?
Это то, что у меня есть в настоящее время в моем делете приложения:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
- (void)applicationWillResignActive:(UIApplication *)application
{
[self.locationManager startUpdatingLocation];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[self.locationManager stopUpdatingLocation];
}
Я заметил, что иногда на некоторое время после того, как я нажимаю кнопку "домой" в своем приложении, мое приложение приостанавливается - предположительно, поскольку Core Location пытается получить исправление местоположения для доставки в приложение.
Я также хотел бы знать, как только вы узнаете о местоположении, сколько времени у вас есть, прежде чем система снова приостановит вас, если новое обновление местоположения не поступит? Должен ли я попытаться получать непрерывные обновления местоположения (стиль навигации), чтобы я никогда не был приостановлен?
Пожалуйста, помогите!
Спасибо
Ответы
Ответ 1
Учитывая, что это было спрошено 3 года назад, я попытаюсь дать ответ, применимый к 2017 году. Если вы используете Swift, я бы настоятельно предложил использовать эту инфраструктуру https://github.com/MHaroonBaig/MotionKit.
Это делает тривиальным использование сервисов CoreMotion. Возможно, есть еще одна дружественная оболочка для служб Core Location.
Я нашел еще один вопрос SO, который, похоже, ответил на это, используя ваш подход к службам захвата местоположения, чтобы оставаться активным в фоновом режиме.
Запустить приложение более 10 минут в фоновом режиме
Надеюсь, это поможет. Я просто оставлю слово предостережения, что использование служб определения местоположения для получения данных непрерывного акселерометра в фоновом режиме без фактических потребностей в службах определения местоположения, вероятно, будет основанием для отклонения вашего приложения от магазина приложений. Приложения для навигации действительно используют данные о местоположении и акселерометре. Простым ответом было бы добавить функцию, которая фактически использует это местоположение, чтобы оправдать получение данных акселерометра в фоновом режиме. Во всяком случае, удачи.