详解iOS计步器的几种实现方式

  

这篇文章介绍两种可以获取计步数据的方法,一种是采用CMPedometer获取手机计步器数据,另一种是采用HealthKit框架从手机健康应用中获取计步数据。另外玩了一下写入数据到健康应用。有描述不当之处,望指点。
  

  

花絮(用HealthKit框架构建应用,写入数据到苹果健康的应用中,QQ和保持等第三方应用的运动数据都会随之改变,猜测它们的运动数据是直接从苹果健康应用中获取,而且没有过滤掉其它数据来源。而微信运动的数据不会变,猜测其来源可能是使用CMPedometer类获取的,因为测试发现把微信运动的数据来源(苹果健康)关闭后,依然会有运动数据,而且该运动数据和CMPedometer类获取的一致。)

  

详解iOS计步器的几种实现方式

  

<强>使用CMPedometer类来获取步数和距离

  

使用时需要导入& lt; CoreMotion/CoreMotion.h>,此类在iOS8之后才可用,在iOS8之前,使用CMStepCounter类(在iOS8之后被CMPedometer替代)来获取步数,使用方法如CMPedometer类相似。

  

CMPedometer   

+ (BOOL) isStepCountingAvailable;设备是否支持计步功能

  

+ (BOOL) isDistanceAvailable;除了计步,设备是否支持距离估计

  

+ (BOOL) isFloorCountingAvailable;除了计步,设备是否支持台阶计数

  

+ (BOOL) isPaceAvailable NS_AVAILABLE (NA, 9 _0);除了计步,设备是否支持速度估计

  

+ (BOOL) isCadenceAvailable NS_AVAILABLE (NA, 9 _0);除了计步,设备是否支持节奏估计

  

+ (BOOL) isPedometerEventTrackingAvailable NS_AVAILABLE (NA, 10 _0) __WATCHOS_AVAILABLE(3 _0);设备是否支持计步器事件

  

- (void) queryPedometerDataFromDate: (NSDate *)开始迄今为止:(NSDate *) withHandler: (CMPedometerHandler)处理程序;在给定时间范围内查询用户的行走活动,数据最多可以使用7天内有效,返回的数据是从系统范围的历史记录中计算出来的,该历史记录是在后台连续收集的。结果返回在串行队列中。

  

- (void) startPedometerUpdatesFromDate: (NSDate *)开始withHandler: (CMPedometerHandler)处理程序;在串行队列上启动一系列连续计步器更新到处理程序。对于每次更新,应用程序将从指定的开始日期和与最新确定相关联的时间戳开始收到累积的行人活动。如果应用程序在后台进行背景调整,则应用程序将在下次更新中收到在后台期间累积的所有行人活动。

  

- (void) stopPedometerUpdates;停止计步器更新

  

- - - - - - (void) startPedometerEventUpdatesWithHandler: (CMPedometerEventHandler)处理程序NS_AVAILABLE (NA, 10 _0) __WATCHOS_AVAILABLE(3 _0);在串行队列上启动计步器事件更新。事件仅在应用程序在前台/后台运行时可用。

  

- (void) stopPedometerEventUpdates NS_AVAILABLE (NA, 10 _0) __WATCHOS_AVAILABLE(3 _0);停止计步器事件更新

  

<强> CMPedometerData

  

@ property(只读,那么原子)NSDate * startDate可以;计步器数据有效期间的开始时间。这是会话或历史查询请求的开始时间。

  

@ property(只读,那么原子)NSDate * endDate;计步器数据有效期间的结束时间。对于更新,这是最新更新的时间。对于历史查询,这是请求的结束时间。

  

@ property(只读,那么原子)NSNumber * numberOfSteps;用户的步数

  

@ property(只读的,原子,可以为空)NSNumber *距离;用户行走和跑步时估计的一米为单位的距离。若设备不支持则值为nil

  

@ property(只读的,原子,可以为空)NSNumber * floorsAscended;上楼的大概楼层数,若设备不支持则值为nil

  

@ property(只读的,原子,可以为空)NSNumber * floorsDescended;下楼的大概楼层数,若设备不支持则值为nil

  

@ property(只读的,原子,可以为空)NSNumber * currentPace NS_AVAILABLE (NA, 9 _0);对于更新,这将以s/m(每米秒)返回当前速度。如果满足以下条件,则值为零:1。资料尚未公布2。历史查询3。平台不支持

  

@ property(只读的,原子,可以为空)NSNumber * currentCadence NS_AVAILABLE (NA, 9 _0);对于更新,这将返回以秒为单位执行行走的节奏。如果满足以下条件,则值为零:1。资料尚未公布2。历史查询3。平台不支持

  

@ property(只读的,原子,可以为空)NSNumber * averageActivePace NS_AVAILABLE (NA, 10 _0);对于更新,这将返回自startPedometerUpdatesFromDate: withHandler:,以s/m(每米秒))的平均活动速度。对于历史查询,这将返回startDate可以和endDate之间的平均活动速度。平均主动速度省略了非活动时间,平均步调从用户移动。如果满足以下条件,则值为零:1。对于历史信息查询,信息无效。例如用户在开始时间和结束时间内没有移动2。平台不支持

详解iOS计步器的几种实现方式