iOS Healthkit和CMPedometer區(qū)別

轉(zhuǎn)IOS 計步器功能 Healthkit和CMPedometer
文/貪吃魚(簡書作者)
原文鏈接:http://www.lxweimin.com/p/e01c5869d95c

這幾天在弄計步功能, 找了好久看了幾篇零散的文章, 我自己做了總結, 我忘了我看文章的地址了, 沒法附上轉(zhuǎn)載連接了

CMPedometer 可以訪問用戶活動(可以訪問計步數(shù)據(jù)) 適用ios8以上的系統(tǒng) ios可看最下面說明

Healthkit 是ios系統(tǒng)中的健康應用 需要應用授權來訪問健康數(shù)據(jù)(比如計步)

這兩個有什么區(qū)別呢?
其實 Healthkit 也是 使用 CMPedometer 讀取用戶的步數(shù)和走的里程,當然計算的方法是在手機內(nèi)部計算的, 它是利用 iphone5s 以上的m處理器來獲取數(shù)據(jù)計算了,所以5s以下的設備是不支持 CMPedometer 手機計步的,當然有大牛可以利用重力傳感器和加速度傳感器一樣可以寫出自己的計步器軟件,我是個菜鳥只能利用系統(tǒng)的拉

Healthkit計步有個缺點, 計步不準,有人會問了:這個 Healthkit 和我下面的 demo 不都是用 CMPedometer 來獲取計步數(shù)的,為什么 Healthkit 不準呢?
答: 那是因為Healthkit記錄的時區(qū)問題, ios獲取時間的時區(qū)按中國的時區(qū)少了8個小時, 舉個例子, 如果我要記錄 5月5日的數(shù)據(jù)應該是 xxxx-05-05 00:00:00 至xxxx-05-05 23:59:59 這個區(qū)間的步數(shù)情況, 而 Healthkit 記錄的時區(qū)卻是 xxxx-05-04 16:00:00 至 xxxx-05-05 15:59:59 ,所以Healthkit記錄的信息是不準的, 如果要是自己開發(fā)計步軟件呢,我們就要自己寫把, 不要獲取 Healthkit 的信息啦

以下demo是用 swift語言寫的

定義個全局變量 如果不是全局變量會報錯
let pedonmeter:CMPedometer = CMPedometer()

在方法里面寫, 兩種方法用哪個都可以,不明白的地方可以看文檔
//判斷該設備是否支持計步功能
if CMPedometer.isStepCountingAvailable(){
//開始時間
let startTime = getStartTime()
//結束時間
let endTime = getEndTime()
//第一種
//獲取一個時間范圍內(nèi)的數(shù)據(jù)最大7天 參數(shù) 開始時間,結束時間, 一個閉包
pedonmeter.queryPedometerDataFromDate(startTime, toDate:endTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in
if error != nil{
print("error:\(error)")
}
else{
print("開始時間:\(startTime)")
print("結束時間:\(endTime)")
print("步數(shù)===\(pedometerData!.numberOfSteps)")
print("距離===\(pedometerData!.distance)")
}
})
}

//第二種
//獲取指定開始時間到當前時間的數(shù)據(jù) 參數(shù) 開始時間, 一個閉包
pedonmeter.startPedometerUpdatesFromDate(startTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in
if error != nil{
print("error:\(error)")
}
else{
print("開始時間:\(startTime)")
print("結束時間:\(endTime)")
print("步數(shù)===\(pedometerData!.numberOfSteps)")
print("距離===\(pedometerData!.distance)")
}
})

下面是獲取時間的方法,我是獲取當天的,你們也可以自己改

獲取當前時區(qū)的時間
*/
func getEndTime() -> NSDate
{
//轉(zhuǎn)換成本地時區(qū)
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)
//獲取本地時區(qū)的當天0時0分0秒
let zone = NSTimeZone.systemTimeZone()
let interval = zone.secondsFromGMTForDate(tdate!)
let nowday = tdate!.dateByAddingTimeInterval(Double(interval))
return nowday
}

如果你像支持ios7的話那不就能使用CMPedometer
CMPedometer 的前身是 CMStepCounter
大家可以參考http://www.aichengxu.com/view/27076

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,184評論 6 13
  • 這幾天在弄計步功能, 找了好久看了幾篇零散的文章, 我自己做了總結, 我忘了我看文章的地址了, 沒法附上轉(zhuǎn)載連接了...
    貪吃魚閱讀 4,633評論 19 3
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,252評論 4 61
  • 家鄉(xiāng)的味道是無法忘記的味道,也是直得懷念的味道
    哥就拽閱讀 63評論 0 0
  • 美麗的夕陽 最寂寞的人才會懂得欣賞 直待光線的余溫不在 繁忙之中 依然會眺望遠方 因為那里有我的家鄉(xiāng) 這是日復一日...
    nalane閱讀 199評論 0 3