美文网首页Swift
iOS通过CMPedometer实现计步器

iOS通过CMPedometer实现计步器

作者: 喔牛慢慢爬 | 来源:发表于2022-05-12 15:17 被阅读0次

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)
        }
    }
    

相关文章

网友评论

    本文标题:iOS通过CMPedometer实现计步器

    本文链接:https://www.haomeiwen.com/subject/hoosurtx.html