Обнаружение, если пользователь движется в автомобиле

УВЕДОМЛЕНИЕ . Этот вопрос был первоначально опубликован до того, как Apple представила аппаратные средства обнаружения движения и связанные с ними API в SDK iOS. Однако ответы на этот вопрос остаются актуальными.


Я создаю приложение iOS для iPhone, которое включает в себя отслеживание работы пользователя и / или ходьбы. Очень важно, чтобы записанные результаты пользователей выполнялись и проходили честно. Мне нужен способ поймать пользователя, который может обманывать (или случайно оставил трекер) при использовании автомобиля.

Чтобы проверить, ехал ли пользователь или ехал в машине, я сначала подумал об этих двух проверках, однако ни один из них не может определить, находится ли пользователь в машине или нет (до точки).

  1. Проверьте текущую скорость пользователя следующим образом. Если пользователь путешествует быстрее, чем 20-ий MPH, я могу предположить, что пользователь находится в машине:

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *recentLocation = [locations lastObject]; recentLocation.speed; //If speed is over 20 MPH, assume the user is not on their feet. 

    Тем не менее, я не уверен, что это действительно хорошая проверка, потому что люди записывались быстрее, чем раньше . Это хорошая проверка или я должен использовать что-то еще?

  2. Определите, как быстро пользователь ускоряется с использованием Accelerometer и Motion API, предоставляемых Core Motion Framework . Если пользователь ускоряется с определенной скоростью, я могу предположить, что пользователь путешествует в автомобиле.

Правильны ли эти предположения? Я предполагаю, что мой реальный вопрос таков: есть ли лучший способ определить, движется ли пользователь в транспортном средстве – если да, то как? , А если нет, то подходят ли эти проверки для этого случая или это будет просто раздражать некоторых пользователей, которые на самом деле так быстро? Является ли CoreMotion подходящим API для этого?


EDIT: новый сопроцессор iPhones 5S M7 обеспечивает более точное обнаружение движения. Может ли кто-нибудь объяснить, как использовать новые API M7?

4 Solutions collect form web for “Обнаружение, если пользователь движется в автомобиле”

Все советы о мудрости (или их отсутствии) в предположении о состоянии движения из данных местоположения по-прежнему применяются. Но в отношении вашего обновления о Core Motion и M7 …

Да, вы можете использовать Core Motion на устройствах с сопроцессором движения M7, M8, M9 и т. Д. (*), Чтобы узнать, может ли пользователь ездить.

  1. Создайте объект CMMotionActivityManager (после использования его метода класса isActivityAvailable чтобы определить, есть ли у вас функции M7 (+)) и либо запускать обновления активности, либо запрашивать его для последних действий.
  2. Проверьте CMMotionActivity automotive собственности возвращенных объектов CMMotionActivity чтобы узнать, думает ли iOS, что пользователь находится в машине.
  3. Нет третьего шага.

Однако, как и выводы GPS, вы все равно должны получать эту информацию с солью. API-интерфейсы CoreMotion дают вам наилучшую оценку iOS в отношении активности пользователя, но нет гарантии, что он на 100% точнее. (Например, я не уверен, что поездка на поезде может считаться automotive . Также обратите внимание, что разные виды деятельности не являются взаимоисключающими.) Лучше для вашего приложения проверить типы активности, которые вам интересны, чем попробовать чтобы исключить те, которые вы не хотите.


(*) Устройства M7 – это те, у кого есть A7 SoC: iPhone 5s, iPad Air, iPad mini 2. M8 – это A8, M9 – A9 и т. Д. Короче говоря, каждое устройство iOS появилось с осени 2013 года, за исключением iPhone 5c.

Вы можете использовать эту простую библиотеку, чтобы определить, движется ли пользователь, работает ли он на транспортном средстве или не двигается.

Работает на всех устройствах iOS и не нуждается в чипе M7.

https://github.com/SocialObjects-Software/SOMotionDetector

В репо вы можете найти демонстрационный проект

CLLocation основе CLLocation – единственная надежная информация, которую вы можете получить. Как указано Ali in Need, чтобы найти расстояние с помощью гироскопа + акселерометра, бесполезно находить скорость и положение в течение более длительного периода времени. Интегрированные значения ускорения начинают дрейфовать через 0,5 – 2 секунды, и нет возможности снова их откалибровать.

В зависимости от вашего варианта использования я вижу еще несколько проблем, чем 44,72 км / ч (27,79 миль / ч) Усэйн-Болта:

  1. Регионы без GPS-сигнала, такие как туннели, подземная автостоянка, …
  2. Ошибки в GPS. Я помню 6-часовую экскурсию в немецких Альпах, и это то, о чем придумал приложение 🙂
    Прогулка по воде со скоростью 920 км / ч
  3. Как вы уже упоминали, вы никогда не знаете, находится ли пользователь в машине, поезде, метро, ​​автобусе … И вы никогда не знаете, водит ли он себя или только штурман – если это имеет значение.

Xcode 7.3, iOS 9.3

Спасибо всем оригинальным вкладчикам.

Я просто потратил несколько часов, пытаясь понять, почему этот довольно прямой класс не работает для меня. Я использовал все предложения выше и из других сообщений, чтобы узнать, какую активность iOS считает, что пользователь выполняет работу с базой Core Motion и использует класс CMMotionActivityManager .

Оказывается, по какой-то причине у меня отключилось «Фитнес-слежение» в «Настройках» -> «Конфиденциальность» -> «Движение и фитнес» . И по какой-либо причине после добавления фреймворка и вызова класса CM приложение. не просил разрешить это. Я должен был отключить это вручную.

В конце концов я наткнулся на этот пост …

iOS – действие движения включено в настройках> Конфиденциальность> Движение

Это заставило меня проверить настройки и решить проблему. После того, как я перевернул «Фитнес-слежение» и включил приложение. снова, все работало как шарм.

Надеюсь, это поможет кому-то! Приветствия.

  • Как использовать значения отношения deviceMotion (roll, pitch и yaw) для обнаружения движения
  • Использование акселерометра и гирометра для отслеживания движения телефона независимо от ориентации
  • SceneKit и CoreMotion «отстают» на iPhone 5, но нормально на iPhone 6
  • iPhone собирает данные CoreMotion в фоновом режиме. (более 10 минут)
  • Как определить, присутствует ли M7, иначе это iPhone 5S или новее?
  • Можно ли использовать движение ядра для измерения расстояния
  • iOS CoreMotion - вычисление разности высот
  • Есть ли способ в фоновом режиме получить уведомление о моем приложении при изменении CMMotionActivity?
  • CoreMotion Bump против встряхивания на iPhone
  • Как определить ориентацию устройства, когда включена блокировка ориентации, и приложение поддерживает только портрет
  • Как получать уведомления, когда пользователь отрицает данные о пригодности?
  • Interesting Posts

    Как обеспечить аудиоизображение в течение срока действия iOS?

    Восстановление штата с помощью нескольких раскадровки

    iOS: условный код в зависимости от текущей цели

    Невозможно установить полное изображение в панели навигации.

    AVPlayer не обновляет currentPlaybackTime при поиске в обратном направлении

    Заголовок UITableView заголовка Автоматическая высота не обновляется должным образом

    Отображение предупреждающего сообщения при открытии Facebook в приложении iPhone

    IOS IAP ErrorDomain Code = 0 «Невозможно подключиться к iTunes Store» из ПОЛЬЗОВАТЕЛЕЙ LIVE APP

    Загрузите видео на UICollectionViewCell с фоновым потоком, чтобы создать бесшовную прокрутку

    Обработка новых размеров экрана iPhone с фоновым изображением

    Ошибка отображения симулятора iPhone при повторной установке приложения из Xcode

    Использование Frank в сочетании с файлами заголовков RestKit

    UITableView add cell Animation

    iOS 6.1 действует по-разному с willTransitionToState

    Какой смысл использовать «f» при присвоении значения CGFloat?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.