CMPedometer是iOS8以后推出的CoreMotion框架中用于获取用户运动信息的类,我们可以获取到用户活动的步数、距离、上下楼层数、以及速度等。
API介绍
1、获取步数相关类:
CMPedometer:计步器管理类
CMPedometerEvent:记录计步器事件变化
CMPedometerData:计步器数据类
- CMPedometer:
class func isStepCountingAvailable() -> Bool
判断设备是否支持步长计数功能
open class func isDistanceAvailable() -> Bool
判断设备是否支持距离估算
open class func isFloorCountingAvailable() -> Bool
判断设备是否支持楼层高度计数
open class func isPaceAvailable() -> Bool
判断设备是否支持速度估算
open class func isCadenceAvailable() -> Bool
判断设备是否支持频率估算
open class func isPedometerEventTrackingAvailable() -> Bool
判断设备是否支持计步器事件
open class func authorizationStatus() -> CMAuthorizationStatus
返回计步器的当前授权状态,并进行获取运动权限授权申请
open func queryPedometerData(from start: Date, to end: Date, withHandler handler: @escaping CMPedometerHandler)
设置开始和结束时间,查询一段时间内的计步器数据,此方法是异步的,更新UI需回到主线程,最多可查询7天数据
open func startUpdates(from start: Date, withHandler handler: @escaping CMPedometerHandler)
从某个时间起开始监听计步器数据更新。
1、如果停止运动,则不会再收到运动数据;
2、如果设备进入后台变成挂起状态,在设备回到前台变为活跃状态后,此方法会返回后台时间内的积累数据;
3、此方法是异步的,更新UI需回到主线程;
open func stopUpdates()
停止计步器数据更新,与startUpdates成对使用
open func startEventUpdates(handler: @escaping CMPedometerEventHandler)
开始更新计步器事件
open func stopEventUpdates()
停止更新计步器事件 - CMPedometerEvent:
open var date: Date { get }
事件发生的时间
open var type: CMPedometerEventType { get }
计步器的状态,是个枚举类型
public enum CMPedometerEventType : Int, @unchecked Sendable {
case pause = 0 //计步器暂停
case resume = 1 //计步器恢复
}
当设备在运动中时type为resume状态,当设备静止时type为pause,在后台也可以正常监听
- CMPedometerData
open var startDate: Date { get }
记录的开始时间
open var endDate: Date { get }
记录的结束时间
open var numberOfSteps: NSNumber { get }
步数
open var distance: NSNumber? { get }
距离
open var floorsAscended: NSNumber? { get }
通过楼梯上升的楼层数
open var floorsDescended: NSNumber? { get }
通过楼梯下降的楼层数
open var currentPace: NSNumber? { get }
估算的运动速度
open var currentCadence: NSNumber? { get }
估算的运动频率
open var averageActivePace: NSNumber? { get }
平均速度
2、使用实现
-
初始化
CMPedometer应该定义为属性,否则可能无法正常获取运动信息
//懒加载“运动”类的实例
lazy var pedometer: CMPedometer = {
let _pedometer = CMPedometer()
return _pedometer
}()
-
查询运动数据
当你的步数有更新的时候,会触发这个方法,返回从某一时刻开始到现在所有的信息统计CMPedometerData
if CMPedometer.isStepCountingAvailable() { //开始更新运动数据 self.pedometer.startUpdates(from: Date()) { pedometerData, error in } } //停止更新运动数据 self.pedometer.stopUpdates()
主动查询运动信息
///获取运动步数 private func getPedometer(_ complete: ((_ numberOfSteps: Int64)->Void)?) { //runStartTime设置的跑步开始时间 guard CMPedometer.isStepCountingAvailable() else { print("设备不可用") return } if let _startTime = self.runStartTime { let _endTime = Date() self.pedometer.queryPedometerData(from: _startTime, to: _endTime) {[weak self] pedometerData, error in guard let self = self else { return } if let _error = error{ print("错误:\(_error)") complete?(0) } else{ if let _pedometerData = pedometerData { //此处解析获取运动信息 let _numberOfSteps = _pedometerData.numberOfSteps.int64Value if _numberOfSteps + self.lastStep >= self.stepNumber { complete?(_numberOfSteps) } } } } } else{ complete?(0) } }
网友评论