美文网首页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