原文:http://conradstoll.com/blog/2013/11/24/developing-for-the-m7?
当iPhone 5s发布时我已经开始开发Runtime这个程序,并且从Apple那儿学到M7“motion co-processor”的相关知识。目前已经有一些好文章谈论M7可以干什么,以及我们相信它的工作,但从一个开发者角度来讲,M7提供了一个非常好的追踪用户移动时的脚步以及活动类型的方式。我想写写作为一个开发者都喜欢怎么用它,而不是介绍M7是什么或者如何工作。
M7的API是Core Motion框架的一部分。使用Core Motion追踪用户的脚步和活动变为可能,但是有很多困难,并且需要更多电量。我们和两个直接给我们数据的新类交互,而不是自己计算从加速计和陀螺仪中获得的数据。
第一个,CMStepCounter,提供给我们当用户带着设备时所走的步数。这个类里面只有几个方法。有一个类方法告诉你设备是否支持记步功能,亦称M7是否已经安装。还有两个方法用来开始、结束更新步数。还有一个方法用来根据起始日期查询已走步数的历史记录。
我们首先讨论一下获取步数更新。当你的程序正在运行时,每当达到一定的步数,你可以让iOS执行一个block。当用户跑动时,Runtime就使用这个方法更新屏幕码表。根据我的经验,这个更新会根据你的意愿分发。
还有一个查询方法来查询一定时间内的步数。M7保存着7天有用的信息,所以这个接口可以查询这7天内任何时段的信息。最让我吃惊的是这个API查询起来非常快。就算查询一整周内有价值的步数数据几乎都没花什么时间。尽管这样,你任然可以选择指定一个特定的queue来执行block。如果你想要同步回调,那么你可以指定main queue。如果你想根据结果更新UI,你很可能需要这样做。如果你想根据结果做一些其他类型的计算,那么你可能需要使用background queue。
接下来的活动跟踪有两个新类,CMMotionActivityManager和CMMotionActivity。活动管理和计步器遵循相同的设计模式,用类方法确定可用性,基于block方法的更新和查询。
在这种情况下,虽然查询和更新的回调block行为有些许不同。查询block返回一个CMMotionActivity对象的有序数组。活动根据指定发生的时间排序。这和新CoreLocation推迟更新位置的方法非常相似,该方法返回一个有相同排列方式的位置更新列表。而更新的回调block是返回一个单一的CMMotionActivity对象,并且每次活动改变时会被反复调用。
CMMotionActivity对象将已经发生的活动类型(跑步,步行,站立,骑车或一个未知类型的活动)和系统鉴别出的活动可信度封装起来。一件比较有趣的事就是当你看到数据时,你会发现未知活动类型有一个低或高的可信度。这就意味着iOS也不能确定或完全肯定你到底在干嘛,
我已经注意到一种数据模式:像行走或跑步这类活动,将可信度从低到中,到高,活动只有5秒左右的时候,可信度是低的,中等可信度也只有5秒,如果你长时间维持一种类型的活动,那么将会有一个高的信任度。下面是一个测试程序的屏幕截图,我用来查看查询到某段时间内活动的返回值。红色代表低信任度的,绿色代表高信任度。下面这段时间是上周末的US Grand Prix后我在Circuit of the Americas穿梭于人群中。这也是为什么看起来有点混乱。
总体来说我感觉活动数据是非常准确的。我在Austin和New York’s Central Park用Runtime测试过几次跑步,结果非常好。尽管看起来正是我需要的,但我还是被跑步和步行的低临界值困扰了很久。这是从Runtime截的一张图,显示我一次跑步时不同的活动类型。我花在跑步上是高亮橙色,而走路是高亮黄色。
为了在Runtime中构建这个功能,我使用了查询API,并简单的查询了一个用户开始和结束跑步时的活动类型,然后我可以遍历返回的活动数据来决定用户一路上哪些路径需要高亮的。
所有的API都巧妙设计为基于block的接口。在某种程度上我认为这是Apple’s API design patterns的下一场演化。一个类方法决定访问是否可用。有一个回调block的更新方法。有回调block的查询方法。这是非常清楚,功能,易于使用的接口。
数据似乎是高度精确的。特别是步行和跑步区分的特别精确。我觉得准确性跟你如何拿手机也有关系,我注意到只有手机在口袋或臂包时准确度是非常高的。
如果你考虑到为你的程序增加M7支持,希望这能为你指明方向。我认为它的伟大之处是除了健身软件外,更多的软件开始使用M7了。比如Day One,一个优秀的iOS和Mac日志程序,它允许你将你最新的步数数据增加到他们日志分类的最新更新。我非常渴望这个夏天我在John Muir Trail的旅行时我能有一个iPhone5s,这样我就可以使用这个新功能了!
M7是iOS中非常伟大的一个新特性,这可以帮助我们建立应用程序时提供更好的体验。这是一个伟大的特性,并有一个有趣的API可以使用。