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