這幾天在弄計步功能, 找了好久看了幾篇零散的文章, 我自己做了總結, 我忘了我看文章的地址了, 沒法附上轉載連接了
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