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

УВЕДОМЛЕНИЕ . Этот вопрос был первоначально опубликован до того, как 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 – действие движения включено в настройках> Конфиденциальность> Движение

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

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

  • iOS CMMotionActivity Manager, как обнаружить знаки остановки, когда автомобиль остановлен?
  • Обнаружение, когда кто-то начинает ходить с использованием данных Core Motion и CMAccelerometer
  • DeviceMotion относительно мира - multiplyByInverseOfAttitude
  • Какая технология запишет видеозапись в Skype?
  • iOS 7.1: получить данные основного движения (акселерометр, гироскоп), в то время как приложение находится в фоновом режиме
  • Сглаживание фильтра нижних частот акселерометра
  • Безопасный интервал обновления для startDeviceMotionUpdatesToQueue: withHandler :?
  • Техническая характеристика В мире отслеживания влияют ограничения ресурсов
  • Найдите скорость с помощью акселерометра или каркаса движения ядра.
  • Несколько экземпляров CMMotionManager, определяющих интервал обновления
  • Что означает ошибка Motion Motion 102?
  • Interesting Posts

    Поддержка iOS 3.x в Xcode 4

    Mutliple быстрой поддержки dylib в архивированном пакете ipa

    Как сохранить каталог UIImage в документах?

    Библиотека для сжатия PNG во время выполнения на iOS

    как удалить часть изображения, кроме выделения части в ios

    Почему все библиотеки загрузки асинхронного изображения (SDWebImage, AFNetworking) используют UIImageView вместо UIImage?

    10.6. Мы заметили, что пользователь переходит в Safari для входа в систему или регистрации для учетной записи, что обеспечивает плохой пользовательский интерфейс

    Objective C / iPhone. Как формат Date Time Picker форматирует свои даты (например, полоски YYYY) И как я могу получить эти форматы?

    Понимание результатов архитектуры от липо-инструмента

    XCODE NSXML изменяет значение элемента

    colorWithAlphaComponent пример в Swift

    Как преобразовать HEX в NSString в Objective-C?

    Как обмениваться контентом на WhatsApp с iOS

    Подпись CMake и Code в XCode 8 для проектов iOS

    Удалить определенный элемент массива, равный строке – Swift

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