检测用户是否正在车内移动
注意 :这个问题最初是在苹果在iOS SDK中引入运动检测硬件和相关的API之前发布的。 但是,这个问题的答案仍然是相关的。
我正在创build一个iPhone iOS应用程序,涉及跟踪用户的跑步和/或行走。 logging用户跑步和走路的结果保持诚实是非常重要的。 我需要一种方法来抓住使用汽车时可能会作弊的用户(或者意外地离开了跟踪器)。
为了检查用户是在开车还是在车上骑车,我首先想到了这两个检查,但是这两个检查都不能确定用户是否在车中(到某一点)。
-
用以下方法检查用户的当前速度。 如果用户的行驶速度超过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.
但是,我不确定这是否是一个很好的检查,因为人们logging的速度比以前更快 。 这是一个很好的检查,还是应该使用别的东西?
-
确定用户使用Core Motion Framework提供的Accelerometer和Motion API进行加速的速度。 如果用户加速超过一定的速度,那么我可以假设用户正在车辆中旅行。
这些假设是正确的吗? 我想我真正的问题是这样的: 有没有更好的方法来检测用户是否在车辆中移动 – 如果是这样的话? 。 如果不是,那么这些检查是否适合这种情况呢,还是会让一些实际上很快的用户感到烦恼呢? CoreMotion是适当的API来做到这一点?
编辑:新的iPhone 5S M7协处理器提供更准确的运动检测。 任何人都可以解释如何使用新的M7 API?
所有关于从位置数据猜测运动状态的智慧(或缺乏)的build议仍然适用。 但关于你的关于Core Motion和M7的更新…
是的,您可以在具有M7,M8,M9等运动协处理器(*)的设备上使用Core Motion来获取用户是否可能驾驶的指示。
- 创build
CMMotionActivityManager
对象(在使用其类方法isActivityAvailable
确定您是否具有M7(+)function)后,可以启动活动更新或查询最近的活动。 - 检查返回的
CMMotionActivity
对象的automotive
属性,看看iOS是否认为用户是在汽车中。 - 没有第三步。
但是,就像GPS推理一样,你仍然应该用一粒盐来获取这些信息。 CoreMotion API为您提供了有关用户活动的最佳猜测,但不能保证100%准确。 (例如,我不确定乘坐火车是否可以算作automotive
,还要注意不同的活动types并不相互排斥)。对于您的应用来说,检查您感兴趣的活动types比尝试更好排除你不想要的。
(*)M7设备是那些与A7 SoC:iPhone 5s,iPad空气,iPad mini 2。M8是A8,M9是A9等。总之,每个iOS设备介绍自2013年秋季以来,不包括iPhone 5c。
您可以使用这个简单的库来检测用户是否在走路,跑步,在车上或不移动。
适用于所有iOS设备,不需要M7芯片。
https://github.com/SocialObjects-Software/SOMotionDetector
在回购你可以find演示项目
基于CLLocation
的检查是唯一可靠的信息,你可以得到。 正如阿里需要find使用陀螺仪加速度计的距离所指定的那样,在较长的时间内find速度和位置是没有用的。 积分的加速度值在0.5-2秒后开始漂移,没有机会重新校准。
根据您的使用情况,我看到比Usain Bolt的44.72 km / h(27.79 mph)更多的问题:
- 没有GPS信号的地区,如隧道,地下停车场,…
- GPS中的错误。 我记得在德国阿尔卑斯山进行了6个小时的跟踪游览,这是应用程序想到的:-)
- 正如你已经提到的,你永远不知道用户是否在汽车,火车,地铁,公共汽车,…你永远不知道他是自己开车还是只是副驾驶 – 如果这很重要。
Xcode 7.3,iOS 9.3
感谢所有原始贡献者。
我花了几个小时试图了解为什么这个相当直接的课程不适合我。 我用上面的所有build议和其他post来看看iOS认为用户使用Core Motion框架和使用CMMotionActivityManager
类的活动。
事实certificate,无论出于何种原因,我在“设置” – >“隐私” – >“运动与健身”中closures了“健身追踪” 。 无论什么原因,添加框架和调用CM类,应用程序。 没有要求启用这个。 我必须手动closures这个function。
最后我偶然发现了这个post…
iOS – 在设置>隐私>动作活动中启用动作活动
这导致我检查设置并解决问题。 之后,我翻转“健身追踪”,并运行应用程序。 再一次,一切都像一个魅力。
希望这会节省一些时间! 干杯。