Обнаружение, движется ли пользователь в автомобиле
ЗАМЕЧАНИЕ. Этот вопрос был первоначально опубликован до того, как Apple представила оборудование для обнаружения движения и соответствующие API в iOS SDK. Ответы на этот вопрос, однако, остаются актуальными.
Я создаю приложение для iPhone на iOS, которое включает отслеживание бега и / или ходьбы пользователя. Очень важно, чтобы записанные результаты бегов и прогулок пользователей оставались честными. Мне нужен способ поймать пользователя, который может обманывать (или случайно оставил трекер включенным) при использовании автомобиля.
Чтобы проверить, ездит ли пользователь или едет в машине, я сначала подумал об этих двух проверках, однако ни одна из них не может определить, действительно ли пользователь находится в машине или нет (в точку).
Проверьте текущую скорость пользователя следующим способом. Если пользователь путешествует быстрее 20-ти миль в час, я могу предположить, что он в машине:
- (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, предоставляемые с CoreMotion Framework. Если пользователь ускоряется с определенной скоростью, я могу предположить, что он путешествует в автомобиле.
Верны ли эти предположения? Я предполагаю, что мой настоящий вопрос заключается в следующем: есть ли лучший способ определить, движется ли пользователь в транспортном средстве - если да, то как?, А если нет, то подходят ли эти проверки для этого случая или это будет раздражать некоторых пользователей, которые на самом деле так быстро? Является ли CoreMotion подходящим API для этого?
РЕДАКТИРОВАТЬ: Новый iPhone 5S M7 сопроцессор обеспечивает более точное обнаружение движения. Кто-нибудь может объяснить, как использовать новые API M7?
4 ответа
Все советы относительно мудрости (или ее отсутствия) в угадывании состояний движения по данным о местоположении все еще применимы. Но что касается вашего обновления о Core Motion и M7...
Да, вы можете использовать Core Motion на устройствах с сопроцессором движения M7, M8, M9 и т. Д. (*), Чтобы получить представление о том, может ли пользователь вести машину.
- Создать
CMMotionActivityManager
объект (после использования его метода классаisActivityAvailable
чтобы определить, есть ли у вас функции M7(+), и либо запустить обновления действий, либо запросить их о последних действиях. - Проверьте возвращенный
CMMotionActivity
объекты'automotive
свойство, чтобы узнать, считает ли iOS, что пользователь находится в машине. - Там нет третьего шага.
Однако, как и выводы 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
проверка на основе единственной надежной информации, которую вы можете получить. Как указано Али в " Требуется найти расстояние с помощью гироскопа + акселерометр", бесполезно находить скорость и положение в течение более длительного периода времени. Интегрированные значения ускорения начинают дрейфовать через 0,5 - 2 секунды, и нет никакой возможности снова выполнить их калибровку.
В зависимости от вашего варианта использования я вижу больше проблем, чем у 44,72 км / ч Усэйна Болта (27,79 миль в час):
- Регионы без GPS-сигнала, такие как туннели, подземная парковка,...
- Ошибки в GPS. Я помню 6-часовой тур трекинга в немецких Альпах, и вот что приложение об этом подумало:-)
- Как вы уже упоминали, вы никогда не знаете, находится ли пользователь в машине, поезде, метро, автобусе,... И вы никогда не знаете, ведет ли он себя сам или только штурман - если это имеет значение.
Xcode 7.3, iOS 9.3
Спасибо всем оригинальным авторам.
Я просто потратил несколько часов, пытаясь понять, почему этот довольно простой курс не работает для меня. Я использовал все предложения, приведенные выше, а также из других постов, чтобы увидеть, какую активность, по мнению iOS, пользователь выполняет с помощью платформы Core Motion и с помощью CMMotionActivityManager
учебный класс.
Оказывается, по какой-то причине у меня отключено "Отслеживание фитнеса" в "Настройках"->"Конфиденциальность"->"Движение и фитнес". И по какой-либо причине после добавления фреймворка и вызова класса CM приложение. не просил включить это. Должно быть, я выключил это вручную.
В конце концов я наткнулся на этот пост...
iOS - включена ли активность в разделе "Настройки"> "Конфиденциальность"> "Активность в движении"
Который побудил меня проверить настройки и решить проблему. После того как я включил "Отслеживание фитнеса" и запустил приложение. опять все работало как шарм.
Надеюсь, это сэкономит кому-то время! Приветствия.