ios - tiene - Detectando si un usuario se está moviendo en un automóvil
iphone 10 tiene nfc (4)
El CLLocation
basado en CLLocation
es la única información confiable que puede obtener. Según lo especificado por Ali en la necesidad de encontrar distancia usando Gyro + Acelerómetro , es inútil encontrar la velocidad y la posición por un período de tiempo más largo. Los valores de aceleración integrados comienzan a la deriva después de 0.5 - 2 segundos y no hay posibilidad de volver a calibrarlos.
Dependiendo de su caso de uso, veo algunos problemas más que los 44.72 km / h (27.79 mph) de Usain Bolt:
- Regiones sin señal GPS como túneles, estacionamiento subterráneo, ...
- Errores en el GPS Recuerdo un recorrido de seguimiento de 6 horas en los Alpes alemanes y esto es lo que la aplicación pensó al respecto :-)
- Como ya lo mencionó, nunca se sabe si el usuario está en el automóvil, el tren, el metro, el autobús, ... Y nunca se sabe si se está conduciendo solo o solo el copiloto, si esto es importante.
AVISO : esta pregunta se publicó originalmente antes de que Apple introdujera el hardware de detección de movimiento y las API asociadas en el SDK de iOS. Las respuestas a esta pregunta, sin embargo, siguen siendo relevantes.
Estoy creando una aplicación iPhone para iOS que implica rastrear el funcionamiento o la marcha de un usuario. Es muy importante que los resultados registrados de las corridas y paseos de los usuarios sigan siendo honestos. Necesito una forma de atrapar a un usuario que puede estar engañando (o accidentalmente haber dejado el rastreador) al usar un automóvil.
Para comprobar si el usuario está conduciendo o viajando en un automóvil, primero pensé en estos dos controles, sin embargo, ninguno puede determinar si el usuario está en un automóvil o no (hasta cierto punto).
Verifique la velocidad actual del usuario en el siguiente método. Si el usuario viaja más rápido que MPH de 20 ish, entonces podría asumir que el usuario está en un automóvil:
- (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.
Sin embargo, no estoy seguro de si esto es realmente un buen control porque las personas han sido registradas para ir más rápido que antes . ¿Es esto un buen control o debería usar algo más?
Determine qué tan rápido el usuario está acelerando usando el Acelerómetro y las API de movimiento provistas con Core Motion Framework . Si el usuario acelera más de una cierta velocidad, entonces podría suponer que el usuario viaja en un vehículo.
¿Son estas suposiciones correctas? Creo que mi verdadera pregunta es esta: ¿hay alguna forma mejor de detectar si el usuario se está moviendo en un vehículo? Si es así, ¿cómo? . Y si no, ¿son estos controles adecuados para este caso o esto sería molesto para algunos usuarios que son tan rápidos? ¿CoreMotion es la API adecuada para hacer esto?
EDITAR: El nuevo Coprocesador iPhones 5S M7 proporciona una detección de movimiento más precisa. ¿Alguien podría explicar cómo usar las nuevas API de M7?
Puede usar esta biblioteca simple para detectar si el usuario está caminando, corriendo, en el vehículo o no se está moviendo.
Funciona en todos los dispositivos iOS y no necesita chip M7.
https://github.com/SocialObjects-Software/SOMotionDetector
En repo puedes encontrar un proyecto de demostración
Todos los consejos sobre la sabiduría (o la falta de ellos) para adivinar los estados de movimiento a partir de los datos de ubicación siguen siendo válidos. Pero con respecto a su actualización sobre Core Motion y M7 ...
Sí, puede usar Core Motion en dispositivos con un coprocesador de movimiento M7, M8, M9, etc. (*) para obtener una indicación de si el usuario podría estar conduciendo.
- Cree un objeto
CMMotionActivityManager
(después de usar su método de claseisActivityAvailable
para determinar si tiene características M7 (+)) y comience las actualizaciones de actividad o consulte las actividades recientes. - Compruebe la propiedad
automotive
los objetosCMMotionActivity
devueltos para ver si iOS cree que el usuario está / estaba en un automóvil. - No hay paso tres.
Sin embargo, al igual que las inferencias de GPS, debería tomar esta información con un grano de sal. Las API de CoreMotion le dan la mejor estimación de iOS sobre la actividad del usuario, pero no hay garantía de que sea 100% precisa. (Por ejemplo, no estoy seguro de si montar un tren podría considerarse automotive
. También tenga en cuenta que los diferentes tipos de actividades no son mutuamente excluyentes). Es mejor para su aplicación verificar los tipos de actividad que le interesan que intentarlo para excluir los que no quieres.
(*) Los dispositivos M7 son aquellos con el SoC A7: iPhone 5s, iPad Air, iPad mini 2. M8 es A8, M9 es A9, etc. En resumen, todos los dispositivos iOS se introdujeron desde el otoño de 2013, excluyendo el iPhone 5c.
Xcode 7.3, iOS 9.3
Gracias a todos los colaboradores originales.
Acabo de pasar unas horas tratando de entender por qué esta clase bastante directa no funcionaba para mí. Utilicé toda la sugerencia anterior y de otras publicaciones para ver qué actividad iOS creía que el usuario estaba realizando utilizando el marco Core Motion y utilizando la clase CMMotionActivityManager
.
Resulta que, por la razón que sea, tuve mi "Seguimiento de estado físico" en "Configuración" -> "Privacidad" -> "Movimiento y estado físico" desactivado . Y por cualquier razón después de agregar el marco y llamar a una clase CM, la aplicación. no solicitó habilitar esto. Debo haber apagado esto manualmente.
Eventualmente me encontré con esta publicación ...
iOS: actividad de movimiento habilitada en Configuración> Privacidad> Actividad de movimiento
Lo que me llevó a verificar la configuración y resolver el problema. Después de activar "Fitness Tracking" para activar y ejecutar la aplicación. nuevamente, todo funcionó como un encanto.
¡Espero que esto le ahorre algo de tiempo a alguien! Aclamaciones.