iOS Healthkit和CMPedometer區(qū)別

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

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

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

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

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

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

以下demo是用 swift語言寫的

定義個(gè)全局變量 如果不是全局變量會(huì)報(bào)錯(cuò)
let pedonmeter:CMPedometer = CMPedometer()

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

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

下面是獲取時(shí)間的方法,我是獲取當(dāng)天的,你們也可以自己改

獲取當(dāng)前時(shí)區(qū)的時(shí)間
*/
func getEndTime() -> NSDate
{
//轉(zhuǎn)換成本地時(shí)區(qū)
let date = NSDate()
let zone = NSTimeZone.systemTimeZone()
let interval = zone.secondsFromGMTForDate(date)
let nowDate = date.dateByAddingTimeInterval(Double(interval))
return nowDate
}
/**
獲取開始時(shí)間 當(dāng)天0時(shí)0分0秒
*/
func getStartTime() -> NSDate
{
let datef = NSDateFormatter()
datef.dateFormat = "yyyy-MM-dd"
let stringdate = datef.stringFromDate(getEndTime())
print("當(dāng)天日期:\(stringdate)")
let tdate = datef.dateFromString(stringdate)
//獲取本地時(shí)區(qū)的當(dāng)天0時(shí)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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容