35

注意:这个问题最初是在 Apple 在 iOS SDK 中引入运动检测硬件和相关 API 之前发布的。然而,这个问题的答案仍然相关。


我正在创建一个 iPhone iOS 应用程序,其中涉及跟踪用户的跑步和/或步行。用户跑步和步行的记录结果保持诚实是非常重要的。我需要一种方法来捕捉可能在使用汽车时作弊(或不小心打开跟踪器)的用户。

为了检查用户是否正在开车或骑车,我首先想到了这两个检查,但是两者都不能真正确定用户是否在车内(在一定程度上)。

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

    但是,我不确定这是否真的是一个很好的检查,因为人们被记录为比以前走得更快。这是一个很好的检查还是我应该使用其他东西?

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

这些假设是否正确?我想我真正的问题是:有没有更好的方法来检测用户是否在车辆中移动 - 如果是这样,如何?. 如果不是,那么这些检查是否适合这种情况,或者这只会让一些实际上那么快的用户感到恼火?CoreMotion 是否适合使用此 API?


编辑:新的 iPhone 5S M7 协处理器提供更准确的运动检测。谁能解释如何使用新的 M7 API?

4

4 回答 4

30

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

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

  1. 创建一个CMMotionActivityManager对象(在使用其类方法isActivityAvailable确定您是否具有 M7(+) 功能之后),然后启动活动更新或查询最近的活动。
  2. 检查返回CMMotionActivity对象的automotive属性以查看 iOS 是否认为用户正在/曾经在汽车中。
  3. 没有第三步。

但是,就像 GPS 推断一样,您仍然应该对这些信息持保留态度。CoreMotion API 为您提供 iOS 对用户活动的最佳猜测,但不能保证 100% 准确。(例如,我不确定乘坐火车是否可以算作automotive。另请注意,不同的活动类型并不相互排斥。)您的应用最好检查您感兴趣的活动类型,而不是尝试排除你不想要的。


(*) M7 设备是配备 A7 SoC 的设备:iPhone 5s、iPad Air、iPad mini 2。M8 是 A8,M9 是 A9,等等。简而言之,自 2013 年秋季以来推出的所有 iOS 设备,不包括 iPhone 5c。

于 2013-11-20T18:19:14.540 回答
15

您可以使用这个简单的库来检测用户是在步行、跑步、在车辆上还是不动。

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

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

在 repo 你可以找到演示项目

于 2014-03-08T18:50:24.683 回答
3

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

根据您的用例,我发现比 Usain Bolt 的 44.72 公里/小时(27.79 英里/小时)更多的问题:

  1. 没有 GPS 信号的地区,如隧道、地下停车场、...
  2. GPS中的错误。我记得在德国阿尔卑斯山进行了 6 小时的跟踪之旅,这就是应用程序的想法:-)
    以 920 公里/小时的速度在水上行走
  3. 正如您已经提到的,您永远不知道用户是在汽车、火车、地铁、公共汽车上……而且您永远不知道他是在驾驶自己还是只是副驾驶——如果这很重要。
于 2013-07-26T07:26:19.367 回答
2

Xcode 7.3,iOS 9.3

感谢所有原始贡献者。

我只是花了几个小时试图理解为什么这个相当直接的课程不适合我。我使用上面的所有建议以及其他帖子中的建议来查看 iOS 认为用户使用 Core Motion 框架和使用CMMotionActivityManager该类正在执行的活动。

事实证明,无论出于何种原因,我在“设置”->“隐私”->“运动与健身”中关闭了“健身追踪”。无论出于何种原因,在添加框架并调用 CM 类之后,app. 没有要求启用此功能。我必须手动关闭它。

终于,我无意中看到了这个帖子……

iOS - 在设置 > 隐私 > 运动活动中启用运动活动

这导致我检查设置并解决问题。在我打开“健身追踪”并运行该应用程序后。再一次,一切都像一个魅力。

希望这可以节省一些时间!干杯。

于 2016-05-30T22:41:24.483 回答