检测用户是否正在开车

时间:2013-07-25 22:09:23

标签: ios objective-c core-location core-motion apple-m7

  

通知:此问题最初是在Apple在iOS SDK中引入动作检测硬件和相关API之前发布的。但是,这个问题的答案仍然具有相关性。


我正在创建一个iPhone iOS应用,其中包括跟踪用户的跑步和/或步行。用户跑步和走路的记录结果保持诚实非常重要。在使用汽车时,我需要一种方法来捕捉可能在作弊(或意外地离开跟踪器)的用户。

为了检查用户是否正在开车或乘坐汽车,我首先想到了这两项检查,但是确实

  1. 使用以下方法检查用户的当前速度。如果用户的行进速度超过20-ahh 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.
    

    但是,我不确定这是否真的是一个很好的检查,因为人们已被记录为faster than that before。这是一个很好的检查还是我应该使用别的东西?

  2. 使用Core Motion Framework提供的Accelerometer和Motion API确定用户加速的速度。如果用户加速超过一定比率,那么我可以假设用户正在车内旅行。

  3. 这些假设是否正确?我想我真正的问题是:有没有更好的方法来检测用户是否在车内移动 - 如果是这样的话?。如果没有,那么这些检查是否适用于这种情况,或者这对于实际 快速的某些用户来说是否会烦恼? CoreMotion是否适合使用?


    编辑:新的iPhone 5S M7协处理器提供更准确的移动检测。任何人都可以解释如何使用新的M7 API吗?

4 个答案:

答案 0 :(得分:30)

关于从位置数据猜测运动状态的智慧(或缺乏智慧)的所有建议仍然适用。但关于你关于Core Motion和M7的更新......

是的,您可以在具有M7,M8,M9等运动协处理器(*)的设备上使用Core Motion来指示用户是否可能正在驾驶。

  1. 创建一个CMMotionActivityManager对象(在使用其类方法isActivityAvailable之后确定您是否具有M7(+)功能),并启动活动更新或查询最近的活动。
  2. 检查返回的CMMotionActivity对象'automotive属性,看看iOS是否认为用户是/在车内。
  3. 没有第三步。
  4. 然而,就像GPS的推论一样,你仍然应该把这些信息带到一边。 CoreMotion API为您提供iOS对用户活动的最佳猜测,但不能保证100%准确。 (例如,我不确定乘坐火车是否可以算作automotive。另请注意,不同的活动类型并不相互排斥。)您的应用最好检查您感兴趣的活动类型而不是试图排除你不想要的那些。


    <*>(*)M7设备是那些配备A7 SoC的设备:iPhone 5s,iPad Air,iPad mini 2. M8是A8,M9是A9等。简而言之,自2013年秋季推出的每款iOS设备都不包括iPhone 5c。

答案 1 :(得分:13)

您可以使用此简单库来检测用户是走路,跑步,车辆还是不移动。

适用于所有iOS设备,无需M7芯片。

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

在回购中你可以找到演示项目

答案 2 :(得分:3)

基于CLLocation的检查是您可以获得的唯一可靠信息。正如阿里在Need to find Distance using Gyro+Accelerometer中所指出的那样,找到更长时间的速度和位置是没有用的。积分加速度值在0.5 - 2秒后开始漂移,并且没有机会再次校准它们。

根据您的使用情况,我看到的问题比Usain Bolt的44.72 km / h(27.79 mph)更多:

  1. 没有GPS信号的地区,如隧道,地下停车场,......
  2. GPS中的错误。我记得在德国阿尔卑斯山进行了6个小时的跟踪之旅,这就是应用程序的想法:-)
    Walking on water with 920 km/h
  3. 正如你已经提到的那样,你永远不知道用户是在汽车,火车,地铁,公共汽车......而且你永远不知道他是在开车还是只是副司机 - 如果这很重要的话。

答案 3 :(得分:1)

Xcode 7.3,iOS 9.3

感谢所有原始贡献者。

我花了几个小时试图理解为什么这个相当直接的课程不适合我。我使用了上面的所有建议和其他帖子来查看iOS认为用户使用Core Motion框架和使用$(document).ready(function() { $("#checkbox").change(function(){ if (this.checked){ $("input[name=student_user_name]").attr("disabled", true); } else { $("input[name=student_user_name]").attr("disabled", false); } }); }); 类进行的活动。

事实证明,无论出于何种原因,我在“设置”中显示了我的“健身追踪” - &gt;“隐私” - &gt;“运动和健身”已关闭。无论出于何种原因,在添加框架并调用CM类之后,该应用程序。没有要求启用此功能。我必须手动关闭它。

最终我偶然发现了这篇文章......

iOS - is Motion Activity Enabled in Settings > Privacy > Motion Activity

这导致我检查设置并解决问题。在我将“健身追踪”翻转到并运行应用程序之后。再一次,一切都像魅力一样。

希望这能节省一些时间!欢呼声。