又改需求了,所以又换了全新的统计步数的方法,整理一下吧。
在iPhone5s以前机型因为没有陀螺仪的存在,所以需要用加速度传感器来采集加速度值信息,然后根据震动幅度让其加入踩点数组并过滤,获取自己需要的步数数据。
直接上代码吧:
首先需要一个步数的model如下:
|
|
然后是如何获取步数,首先判断传感器是否可用
|
|
可用的话开始实现统计步数的算法
|
|
然后iPhone 5s出现了, 增加了 M7 运动协处理器,也带来了CMStepCounter类,从此我们就不用自己计算步数了,只要直接读取就好。
首先还是要检测协处理器是否可用
|
|
然后才是获取步数的方法,主要有两种:
计步 第一种方法
startStepCountingUpdatesToQueue:updateOn:withHandler:
开始分发当前步数计数数据到第三方应用
- (void)startStepCountingUpdatesToQueue:(NSOperationQueue *)queue updateOn:(NSInteger)stepCounts withHandler:(CMStepUpdateHandler)handler
Parameters
queue
被指定执行特定的handler块的操作队列。第三方可以指定一个定制队列或者使用操作队列协助app的主线程。该参数不能为nil
stepCounts
记录的步伐数据,达到该数值去执行handler块。该数值必须大于0
handler
该块在步伐计数达到或超出数值时会被执行,该参数不能为nil。更多块方法信息参考CMStepQueryHandler。
Discussion
该方法实现对用户步伐数据的追踪,并周期性地唤起块方法去分发结果。当第三方调用了该方法,步伐计数器会重置当前步伐数为0,并开始计数。每次计数到达指定的步伐数时,会执行指定的handler块方法。比如,当设定stepCounts为100时,会在100,200,300等数目时发送更新,激活该块方法。每次发送到该块方法的步伐数目都是从你调用该方法开始的步伐数目总和。
每次超过设定步数值时,指定的处理程序块handler会被执行。如果当超过设定值时第三方应用处在被挂起的状态,那程序块也不会被执行。当第三方应用被唤醒,程序块也不会执行,直到再次超过设定步数值。
可以调用stopStepCountingUpdates方法去停止分发步数计数,当然当步数计数对像被销毁的时候,分发过程也会被停止。
代码如下:
|
|
计步 第二种方法
queryStepCountStartingFrom:to:toQueue:withHandler:
收集并返回某一时间段内的历史步数数据
- (void)queryStepCountStartingFrom:(NSDate *)start to:(NSDate *)end toQueue:(NSOperationQueue *)queuewithHandler:(CMStepQueryHandler)handler
Parameters
start
收集步数数据的开始时间,该参数不能为 nil.
end
收集步数数据的停止时间,该参数不能为nil.
queue
执行指定handler块的操作队列,第三方可以指定一个定制队列或者使用操作队列协助app的主线程。该参数不能为nil
handler
执行处理结果的块方法,该参数不能为nil。更多块方法信息参考CMStepQueryHandler。
Discussion
该方法为异步方法,会立即返回并且把结果分发到指定的handler块中处理。系统最多仅存储最近7天内的有效步数数据。如果在指定时间范围内没有数据,则会传递一个0值到handler块中。
代码如下
|
|
另外,iOS7还增加了CMMotionActivity类,用来获取运动状态
|
|
好吧,随着时间的推移,iOS8来了,也带来了healthkit,不过之前的方法满足需求也就还是用的CMStepCounter方法。
不过最近客户改需求了,手环,iWatch的数据也需要统计进来,就不得不用healthkit的方法了。
还是老套路,先检查能不能用
|
|
然后获取步数
|
|
demo完整代码在这里: