iOS通过CMPedometer实现计步器

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)
        }
    }
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容