介紹
CMPedometer:可以訪問使用者活動(可以訪問計步資料) 適用ios8以上的系統 ios可看最下面說明
Healthkit :是ios系統中的健康應用 需要應用授權來訪問健康資料(比如計步)
這兩個有什麼區別呢?
其實 Healthkit 也是 使用 CMPedometer 讀取使用者的步數和走的裡程,當然計算的方法是在手機內部計算的, 它是利用 iphone5s 以上的m處理器來擷取資料計算了,所以5s以下的裝置是不支援 CMPedometer 手機計步的,當然有大牛可以利用重力感應器和加速度感應器一樣可以寫出自己的計步器軟體,我是個菜鳥只能利用系統的拉
Healthkit計步有個缺點, 計步不準,有人會問了:這個 Healthkit 和我下面的 demo 不都是用 CMPedometer 來擷取計步數的,為什麼 Healthkit 不準呢?
答: 那是因為Healthkit記錄的時區問題, ios擷取時間的時區按中國的時區少了8個小時, 舉個例子, 如果我要記錄 5月5日的資料應該是 xxxx-05-05 00:00:00 至xxxx-05-05 23:59:59 這個區間的步數情況, 而 Healthkit 記錄的時區卻是 xxxx-05-04 16:00:00 至 xxxx-05-05 15:59:59 ,所以Healthkit記錄的資訊是不準的, 如果要是自己開發計步軟體呢,我們就要自己寫把, 不要擷取 Healthkit 的資訊啦
以下demo是用 swift語言寫的
定義個全域變數 如果不是全域變數會報錯let pedonmeter:CMPedometer = CMPedometer()在方法裡面寫, 兩種方法用哪個都可以,不明白的地方可以看文檔//判斷該裝置是否支援計步功能if CMPedometer.isStepCountingAvailable(){//開始時間let startTime = getStartTime()//結束時間let endTime = getEndTime()//第一種//擷取一個時間範圍內的資料最大7天 參數 開始時間,結束時間, 一個閉包pedonmeter.queryPedometerDataFromDate(startTime, toDate:endTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in if error != nil{ print("error:\(error)") } else{ print("開始時間:\(startTime)") print("結束時間:\(endTime)") print("步數===\(pedometerData!.numberOfSteps)") print("距離===\(pedometerData!.distance)") } }) }//第二種//擷取指定開始時間到目前時間的資料 參數 開始時間, 一個閉包pedonmeter.startPedometerUpdatesFromDate(startTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in if error != nil{ print("error:\(error)") } else{ print("開始時間:\(startTime)") print("結束時間:\(endTime)") print("步數===\(pedometerData!.numberOfSteps)") print("距離===\(pedometerData!.distance)") } })
下面是擷取時間的方法,我是擷取當天的,你們也可以自己改
/** 擷取當前時區的時間 */ func getEndTime() -> NSDate { //轉換成本地時區 let date = NSDate() let zone = NSTimeZone.systemTimeZone() let interval = zone.secondsFromGMTForDate(date) let nowDate = date.dateByAddingTimeInterval(Double(interval)) return nowDate }/** 擷取開始時間 當天0時0分0秒 */ func getStartTime() -> NSDate { let datef = NSDateFormatter() datef.dateFormat = "yyyy-MM-dd" let stringdate = datef.stringFromDate(getEndTime()) print("當天日期:\(stringdate)") let tdate = datef.dateFromString(stringdate) //擷取本地時區的當天0時0分0秒 let zone = NSTimeZone.systemTimeZone() let interval = zone.secondsFromGMTForDate(tdate!) let nowday = tdate!.dateByAddingTimeInterval(Double(interval)) return nowday }
執行結果:
我當天走了 3107步 距離 2公裡多
注意:如果你像支援ios7的話那不就能使用CMPedometer,CMPedometer 的前身是 CMStepCounter
總結
以上就是iOS實現計步器功能的全部內容,希望本文的內容對大家學習開發IOS能有所協助,如果有疑問歡迎大家留言。