Непрерывное обновление акселерометра в фоновом режиме на iOS

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

Для моего приложения важно получать обновления акселерометра каждые 5 секунд или около того, а в определенных ситуациях может быть и быстрее; без этой функции это не очень полезное приложение.

Итак, как добиться этого? Основная стратегия заключается в использовании метода:

[cmMotionManager startDeviceMotionUpdatesToQueue:...] 

с соответствующим deviceMotionUpdateInterval, а затем каким-то образом «убедиться», что ваше приложение никогда не будет приостановлено, т.е. вам необходимо реализовать один из фоновых режимов (например, местоположение, фоновый звук, VOIP и т. д.)

Это стратегия, используемая многими приложениями, которые уже есть в магазине приложений, такими как Sleep Cycle («запись звука»), Nike+ и Pacer (воспроизведение звука).

(Поправьте меня, если есть другой способ непрерывного получения информации об акселерометре)

Моя проблема в том, что мое приложение не будет записывать звук, не нуждается в VOIP и т. д. и не требует какого-либо нового API фоновой выборки/удаленного уведомления в 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 пытается получить исправление местоположения для доставки в приложение.

Я также хотел бы знать, как только вы проснетесь от обновления местоположения, сколько времени у вас есть, прежде чем система снова приостановит вас, если новое обновление местоположения не поступит? Должен ли я пытаться получать непрерывные обновления местоположения (стиль навигации), чтобы гарантировать, что меня никогда не приостановят?

Пожалуйста помоги!

Спасибо


person BYZZav    schedule 22.12.2013    source источник
comment
возможная копия iPhone, собирающего данные CoreMotion в фоновом режиме . (более 10 минут)   -  person Matias Forbord    schedule 02.03.2014
comment
ты нашел свой ответ?   -  person ChuckKelly    schedule 18.04.2016


Ответы (1)


Учитывая, что этот вопрос был задан 3 года назад, я попытаюсь дать ответ, применимый к 2017 году. Если вы используете Swift, я настоятельно рекомендую использовать эту структуру https://github.com/MHaroonBaig/MotionKit..

Это делает использование сервисов CoreMotion очень тривиальным. Возможно, есть еще одна дружественная оболочка для сервисов Core Location.

Я нашел еще один вопрос SO, который, похоже, ответил на этот вопрос, используя ваш подход к захвату служб определения местоположения, чтобы оставаться активным в фоновом режиме.

Запускать приложение более 10 минут в фоновом режиме

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

person Lobsterman    schedule 21.02.2017