iOS通過CMPedometer實現(xiàn)計步器

CMPedometer是iOS8以后推出的CoreMotion框架中用于獲取用戶運動信息的類睁宰,我們可以獲取到用戶活動的步數(shù)襟企、距離嘱么、上下樓層數(shù)、以及速度等顽悼。

API介紹

1拱撵、獲取步數(shù)相關(guān)類:

CMPedometer:計步器管理類
CMPedometerEvent:記錄計步器事件變化
CMPedometerData:計步器數(shù)據(jù)類

  • CMPedometer:
    class func isStepCountingAvailable() -> Bool
    判斷設(shè)備是否支持步長計數(shù)功能
    open class func isDistanceAvailable() -> Bool
    判斷設(shè)備是否支持距離估算
    open class func isFloorCountingAvailable() -> Bool
    判斷設(shè)備是否支持樓層高度計數(shù)
    open class func isPaceAvailable() -> Bool
    判斷設(shè)備是否支持速度估算
    open class func isCadenceAvailable() -> Bool
    判斷設(shè)備是否支持頻率估算
    open class func isPedometerEventTrackingAvailable() -> Bool
    判斷設(shè)備是否支持計步器事件
    open class func authorizationStatus() -> CMAuthorizationStatus
    返回計步器的當前授權(quán)狀態(tài)辉川,并進行獲取運動權(quán)限授權(quán)申請
    open func queryPedometerData(from start: Date, to end: Date, withHandler handler: @escaping CMPedometerHandler)
    設(shè)置開始和結(jié)束時間,查詢一段時間內(nèi)的計步器數(shù)據(jù)拴测,此方法是異步的,更新UI需回到主線程府蛇,最多可查詢7天數(shù)據(jù)
    open func startUpdates(from start: Date, withHandler handler: @escaping CMPedometerHandler)
    從某個時間起開始監(jiān)聽計步器數(shù)據(jù)更新集索。
    1、如果停止運動汇跨,則不會再收到運動數(shù)據(jù)务荆;
    2、如果設(shè)備進入后臺變成掛起狀態(tài)穷遂,在設(shè)備回到前臺變?yōu)榛钴S狀態(tài)后函匕,此方法會返回后臺時間內(nèi)的積累數(shù)據(jù);
    3、此方法是異步的蚪黑,更新UI需回到主線程;
    open func stopUpdates()
    停止計步器數(shù)據(jù)更新盅惜,與startUpdates成對使用
    open func startEventUpdates(handler: @escaping CMPedometerEventHandler)
    開始更新計步器事件
    open func stopEventUpdates()
    停止更新計步器事件
  • CMPedometerEvent:
    open var date: Date { get }
    事件發(fā)生的時間
    open var type: CMPedometerEventType { get }
    計步器的狀態(tài),是個枚舉類型
public enum CMPedometerEventType : Int, @unchecked Sendable {  
    case pause = 0       //計步器暫停
    case resume = 1   //計步器恢復(fù)
  }

當設(shè)備在運動中時type為resume狀態(tài)忌穿,當設(shè)備靜止時type為pause抒寂,在后臺也可以正常監(jiān)聽

  • CMPedometerData
    open var startDate: Date { get }
    記錄的開始時間
    open var endDate: Date { get }
    記錄的結(jié)束時間
    open var numberOfSteps: NSNumber { get }
    步數(shù)
    open var distance: NSNumber? { get }
    距離
    open var floorsAscended: NSNumber? { get }
    通過樓梯上升的樓層數(shù)
    open var floorsDescended: NSNumber? { get }
    通過樓梯下降的樓層數(shù)
    open var currentPace: NSNumber? { get }
    估算的運動速度
    open var currentCadence: NSNumber? { get }
    估算的運動頻率
    open var averageActivePace: NSNumber? { get }
    平均速度
2、使用實現(xiàn)
  • 初始化

    CMPedometer應(yīng)該定義為屬性掠剑,否則可能無法正常獲取運動信息

//懶加載“運動”類的實例
lazy var pedometer: CMPedometer = {
  let _pedometer = CMPedometer()
  return _pedometer
}()
  • 查詢運動數(shù)據(jù)

    當你的步數(shù)有更新的時候屈芜,會觸發(fā)這個方法,返回從某一時刻開始到現(xiàn)在所有的信息統(tǒng)計CMPedometerData

    if CMPedometer.isStepCountingAvailable() {
      //開始更新運動數(shù)據(jù)
      self.pedometer.startUpdates(from: Date()) { pedometerData, error in
                
      }
    }
    //停止更新運動數(shù)據(jù)
    self.pedometer.stopUpdates()
    

    主動查詢運動信息

    ///獲取運動步數(shù)
    private func getPedometer(_ complete: ((_ numberOfSteps: Int64)->Void)?)  {
      //runStartTime設(shè)置的跑步開始時間
      guard CMPedometer.isStepCountingAvailable() else {
              print("設(shè)備不可用")
              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)
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朴译,一起剝皮案震驚了整個濱河市井佑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眠寿,老刑警劉巖躬翁,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澜公,居然都是意外死亡姆另,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門坟乾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迹辐,“玉大人,你說我怎么就攤上這事甚侣∶鞣裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵殷费,是天一觀的道長印荔。 經(jīng)常有香客問我低葫,道長,這世上最難降的妖魔是什么仍律? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任嘿悬,我火速辦了婚禮,結(jié)果婚禮上水泉,老公的妹妹穿的比我還像新娘善涨。我一直安慰自己,他們只是感情好草则,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布钢拧。 她就那樣靜靜地躺著,像睡著了一般炕横。 火紅的嫁衣襯著肌膚如雪源内。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天份殿,我揣著相機與錄音膜钓,去河邊找鬼。 笑死伯铣,一個胖子當著我的面吹牛呻此,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腔寡,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焚鲜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了放前?” 一聲冷哼從身側(cè)響起忿磅,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凭语,沒想到半個月后葱她,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡似扔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年吨些,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒辉。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡豪墅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黔寇,到底是詐尸還是另有隱情偶器,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站屏轰,受9級特大地震影響颊郎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霎苗,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一姆吭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叨粘,春花似錦猾编、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轰传。三九已至驴党,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間获茬,已是汗流浹背港庄。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恕曲,地道東北人鹏氧。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像佩谣,于是被迫代替她去往敵國和親把还。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容