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

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

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


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

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

  • Проверьте текущую скорость пользователя следующим образом. Если пользователь путешествует быстрее, чем 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.
    

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

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

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


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

4b9b3361

Ответ 1

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

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

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

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


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

Ответ 2

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

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

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

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

Ответ 3

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

В зависимости от вашего варианта использования я вижу еще несколько проблем, кроме Usain Bolt 44.72 км/ч (27.79 миль/ч):

  • Регионы без GPS-сигнала, такие как туннели, подземная автостоянка,...
  • Ошибки в GPS. Я помню 6-часовую экскурсию в немецких Альпах, и это то, о чем придумал приложение:-)
    Walking on water with 920 km/h
  • Как вы уже упоминали, вы никогда не знаете, находится ли пользователь в машине, поезде, метро, ​​автобусе... И вы никогда не знаете, водит ли он себя или только штурман - если это имеет значение.

Ответ 4

Xcode 7.3, iOS 9.3

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

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

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

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

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

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

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