DevQiao Keep on hacking

CoreMotion框架-CMPedometer

比赛作品涉及计步功能,计步属于健康范畴,当前Apple的HealthKit可以很好的提供健康数据,但是由于涉及隐私,在添加HealthKit时必须要付费的开发者账号,而且包含HealthKit的App审核也更严格。 我目前只需实现简单的计步功能,因此关注到了CoreMotion框架的CMPedometer类,今天简单说说:

CMPedometer

这块国内资料较少,科学上网一阵之后发现 官方文档 已经足够清晰明了。顾名思义,该类为了方便获取行走相关数据而设计,除了可用性检查几个关键方法:

生成计步器实时数据

//Swift
func startPedometerUpdatesFromDate(_ start: NSDate,
                       withHandler handler: CMPedometerHandler)

获取历史计步数据

//Swift
func queryPedometerDataFromDate(_ start: NSDate,
                             toDate end: NSDate,
                    withHandler handler: CMPedometerHandler)

CMPedometerHandler

上面提到的block

//Swift
typealias CMPedometerHandler = (CMPedometerData?, NSError?) -> Void

步数主要在CMPedometerData类的numberOfSteps属性里取

昨天做了个测试,踩进坑里倒腾了一下午,总结一下:

  1. CMPedometer最好声明为一个属性!我开始放在viewDidLoad中,声明的临时变量,结果始终取不到数据,报错Error Domain=CMErrorDomain Code=103 "(null)"。原因就是该方法在启动执行完毕后,临时变量就释放了。对于这样一个持续获取数据的类来说,自然在启动后获取不到数据,这里利用打印block中的error参数可以帮助找到问题
  2. 实时更新计步数据的方法异步运行在后台串行队列里,因此如果需要实现界面也跟着实时变化,需要异步回主线程更新UI(GCD很便捷),不然只有在停止数据更新时界面才会变

最后,stackoverflow要多用!

comments powered by Disqus