iOS中 HeathKit框架學習 步數(shù)統(tǒng)計等 韓俊強的博客
來源:程序員人生 發(fā)布時間:2016-11-05 08:38:20 閱讀次數(shù):3478次
逐日更新關(guān)注:http://weibo.com/hanjunqiang 新浪微博!iOS開發(fā)者交換QQ群: 446310206
HeathKit框架學習
本文結(jié)構(gòu)
- 簡介
- 用戶數(shù)據(jù)安全及隱私
- HeathKit框架
- HeathKit使用
- 總結(jié)
簡介
HeathKit
是Apple公司在推出iOS 8 系統(tǒng)時1塊推出的關(guān)于健康信息的框架。如果iPhone手機系統(tǒng)升級到iOS8以后就會發(fā)現(xiàn)多了1個健康-app
,這就是Apple提供的1個記錄用戶健康信息的app,可以用它來分享健康和健身數(shù)據(jù)。還可以指定數(shù)據(jù)的來源,比如我們自己創(chuàng)建1個app,在我們的app中使用了HeathKit
框架以后只要經(jīng)過用戶的認證,就能夠在我們的app當中給健康
分享數(shù)據(jù)或從健康
中獲得數(shù)據(jù)。
HeathKit
可以與健身裝備1起工作,iPhone手機本身可以監(jiān)控步數(shù)信息,會自動導入步數(shù)信息。但是其他信息或裝備需要配套的應(yīng)當才能獲得到數(shù)據(jù)并導入到HeathKit
中并在健康
中顯示。
HeathKit
不能再iPad中使用,而且它也不支持擴大。
用戶數(shù)據(jù)安全及隱私
由于用戶的健康信息多是敏感的,所以這些用戶信息不能讓開發(fā)者很隨意的獲得到。每條信息的讀寫都需要用戶去選擇是不是同意,比如用戶可以同意你獲得到用戶的身高體重,但是不同意讀寫生殖健康等其他用戶不愿意公然的信息。為了避免信息泄漏,我們是不知道用戶是不是制止了某條信息是不是被用戶制止讀取的。簡單的說,如果獲得不到某條信息,就代表沒有這條信息。
關(guān)于更多的關(guān)于隱私的信息,可以參考隱私
HeathKit框架
HeathKit
在各個利用之間提供了1種成心義的方式同享數(shù)據(jù)。因此,我們必須使用HeathKit
框架提供的數(shù)據(jù)類型和單位。這保證了數(shù)據(jù)存在的真正意義,我們不能自定義數(shù)據(jù)類型及單位。框架使用了子類化,例如HKObject
和HKObjectType
抽象類具有很多有平行關(guān)系的子類,當使用Object
或ObjectType
的時候,必須確保使用正確的子類。
在HeathKit
中能夠存儲的類都是HKObject
的子類,大部份HKObject
的子類都是不可變的。每一個對象都有下面的屬性:
- UUID:每一個對象的標識符
- Source:數(shù)據(jù)的來源,來源可以是
HeathKit
的健康app,也能夠是我們自己創(chuàng)建的app。當1個對象存儲到HeathKit
中時會設(shè)置其來源。只有從HeathKit
中獲得到的數(shù)據(jù)的來源才有效。 - Metadata:1個包括該對象額外信息的字典,元數(shù)據(jù)包括預(yù)定義的key和自定義的key,預(yù)定義的key用來幫助我們在利用間同享數(shù)據(jù),而自定義的key用來擴大HeathKit,為對象添加針對利用的數(shù)據(jù)。
HeathKit
的對象主要分為特點和樣本。特點對象代表用戶的基本不變的數(shù)據(jù),包括用戶的生日、血型和性別等。我們創(chuàng)建的app不能修改這些信息,只能讓用戶在健康
中去修改或添加個人特點信息。
樣本對象代表某個特定時間的數(shù)據(jù),所有的樣本類型的對象都是HKSample
的子類。它們都有下面的特性:
- Type :樣本類型,例如:睡眠分享、步行距離、心率樣本等
- StartDate:樣本開始時間
- EndDate:樣本結(jié)束時間。如果是某1個時間的樣本,則開始于結(jié)束時間相同,如果是某個時間段的樣本,則結(jié)束時間在開始時間的后面。
樣本類型又可以分為4個類型:
- 種別樣本(
HKCategorySample
):在iOS 8 中,只有睡眠分析這1個種別樣本。代表有限種類的樣本. - 數(shù)量樣本(
HKQuantitySample
):這類樣本代表存儲數(shù)據(jù)的樣本,比如步數(shù)、距離、用戶的體溫等。它是HeathKit
中最多見的數(shù)據(jù)類型。 - 關(guān)系樣本(
HKCorrelation
):代表復(fù)合數(shù)據(jù),包括1個或多個樣本。在iOS 8 中,用correlation
代表食品和血壓。在創(chuàng)建食品或血壓時,需要用correlation
。 - 訓練活動(
HKWorkout
):代表某種活動,比如走、跑步等。包括有開始時間、結(jié)束時間、運動類型、消耗能量、運動距離等屬性。還可以為workout
關(guān)聯(lián)許多詳細的樣本。不像correlation
,這些樣本不包括在workout
中,但是可以通過workout
獲得到。
再介紹1個HeathKit中常常用到的1些類。
HKSamle
每一個HkSample
的子類都有對應(yīng)的便利方法創(chuàng)建對應(yīng)的對象。比如:
對數(shù)量樣本,需要創(chuàng)建HKQuantity
類的實例。而且數(shù)量的單位和類型標識符文檔中描寫的可用單位要相同。例如:HKQuantityTypeIdentifierHeight
文檔中說明它使用長度單位,因此,你的數(shù)量必須使用厘米、米、英尺、英寸或其他長度單位。

對應(yīng)種別樣本,需要創(chuàng)建HKCategorySample
的實例。它的值必須和類型標識符文檔中描寫的枚舉值相干。例如, HKCategoryTypeIdentifierSleepAnalysi
s 文檔中說明它使用的枚舉值。因此你在創(chuàng)建樣本時必須從這個枚舉中傳遞1個值。

一樣,你必須先創(chuàng)建correlation包括的所有樣本。correlation的類型標識符描寫了它可以包括的類型和對象的數(shù)量。不要把被包括的對象存進HealthKit。它們是以correlation的1部份存儲的。
逐日更新關(guān)注:http://weibo.com/hanjunqiang 新浪微博!iOS開發(fā)者交換QQ群: 446310206

對訓練活動樣本,首先,創(chuàng)建 HKWorkoutType
實例其實不需要指定類型標識符。所有的workout都是用一樣的類型標識符。第2,對每一個workout
你都需要提供1個 HKWorkoutActivityType
值。這個值定義了workout
中履行的活動的類型。最后,當workout
保存到HealthKit
后,你可以給workout
關(guān)聯(lián)額外的樣本。這些樣本提供了workout
的詳細信息。

HKQuery
HeathKit提供了許多查詢讀取數(shù)據(jù)的方法:
- 直接方法查詢。對特點樣本,可以直接查詢獲得到,這些方法只能查詢特點樣本。更多信息: HKHealthStore Class Reference
樣本查詢。這是使用最多的查詢。使用樣本查詢可以查詢在HeathKit中任意的數(shù)據(jù)。而且可以對結(jié)果進行排序等。更多信息:HKSampleQuery Class Reference
視察者查詢。這是1個長時間運行的查詢,它會檢測HealthKit存儲,并在匹配到的樣本產(chǎn)生變化時通知你。如果當存儲產(chǎn)生變化時你想得到通知,就使用視察者查詢。更多信息:HKObserverQuery Class Reference
- 錨定對象查詢。用這類查詢來搜索添加進存儲的項。當錨定查詢第1次履行時,會返回存儲中所有匹配的樣本。在接下來的履行中,只會返回上1次履行以后添加的項目。通常,錨定對象查詢會和視察者查詢1起使用。視察者查詢告知你某些項目產(chǎn)生了變化,而錨定對象查詢來決定有哪些(如果有的話)項目被添加進了存儲。更多信息:HKAnchoredObjectQuery Class Reference
統(tǒng)計查詢。使用這類查詢來在1系列匹配的樣本中履行統(tǒng)計運算。你可使用統(tǒng)計查詢來計算樣本的總和、最小值、最大值或平均值。更多信息: HKStatisticsQuery Class Reference
統(tǒng)計集合查詢。使用這類查詢來在1系列長度固定的時間間隔中履行屢次統(tǒng)計查詢。通常使用這類查詢來生成圖表。查詢提供了1些簡單的方法來計算某些值,例如,每天消耗的總熱量或每5分鐘行走的步數(shù)。統(tǒng)計集合查詢是長時間運行的。查詢可以返回當前的統(tǒng)計集合,也能夠監(jiān)測HealthKit存儲,并對更新做出響應(yīng)。更多信息,參見 HKStatisticsCollectionQuery Class Reference。
Correlation查詢。使用這類查詢來在correlation查找數(shù)據(jù)。這類查詢可以為correlation中每一個樣本類型包括獨立的謂詞。如果你只是想匹配correlation類型,那末請使用樣本查詢。更多信息,參見 HKCorrelation Class Reference。
來源查詢。使用這類查詢來查找HealthKit存儲中的匹配數(shù)據(jù)的來源(利用和裝備)。來源查詢會列出貯存的特定樣本類型的所有來源。更多信息,參見HKSourceQuery Class Reference。
逐日更新關(guān)注:http://weibo.com/hanjunqiang 新浪微博!iOS開發(fā)者交換QQ群: 446310206
HKUnit
這個類代表要查詢的數(shù)據(jù)的單位的類,比如體重的單位,可以為kg、lbs等。這個類為不同的數(shù)據(jù)類型提供了不同的單位方法。1般在創(chuàng)建前面介紹的樣本類型的時候,都需要這個類為樣本添加對應(yīng)的單位。而且提供了1些數(shù)學運算,比如千米、米、厘米等之間的轉(zhuǎn)換。
在某些場合,你可使用格式化器來本地化數(shù)量。iOS8提供了提供了新的格式化器來處理長度(NSLengthFormatter
)、質(zhì)量(NSMassFormatter
)和能量(NSEnergyFormatter
)。對其他的數(shù)量,你需要自己來換算單位和本地化數(shù)據(jù)。
HKHeathStore
HeathKit的核心就是它,它代表HeathKit的數(shù)據(jù)庫,使用它就能夠從數(shù)據(jù)庫中讀取數(shù)據(jù)。比較重要的方法:
- isHealthDataAvailable:判斷當前設(shè)置是不是支持HeathKit
- requestAuthorizationToShareTypes(typesToShare: Set?, readTypes typesToRead: Set?, completion: (Bool, NSError?) -> Void): 向用戶要求同意讀寫某些數(shù)據(jù)
- saveObject(object: HKObject, withCompletion completion: (Bool, NSError?) -> Void) :向數(shù)據(jù)庫中添加數(shù)據(jù)
- executeQuery(query: HKQuery) :履行查詢,即上面介紹的幾種查詢方法。
HeathKit使用
在使用HealthKit
之前,必須要履行以下步驟:
- 打開
HeathKit
,在Target欄中,打開Capabilities
菜單,將HealthKit
這1項的開關(guān)設(shè)為ON的狀態(tài)。 創(chuàng)建HeathManager.Swift
文件,并導入
`import HeathKit`
HeathKit
的核心是HeathStore
,創(chuàng)建
func authorizeHealthKit(completion:((success:Bool,error:NSError!)->Void)!){}
然后調(diào)用在這個方法中調(diào)用isHealthDataAvailable
判斷當前裝備是不是支持HeathKit
//判斷當前裝備是不是支持
if !HKHealthStore.isHealthDataAvailable(){
let error = NSError(domain: "", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this Device"])
if completion != nil {
completion(success: false, error: error)
}
}
,最后在上面的方法中,設(shè)置要讀寫的數(shù)據(jù)類型。
為你的利用實例化1個 HKHealthStore 對象。每一個利用只需要1個HealthKit存儲實例。這個存儲實例就是你和HealthKit數(shù)據(jù)庫交互的主要接口。
let hkHealthStore = HKHealthStore()
使用 requestAuthorizationToShareTypes:readTypes:completion:
來認證要求從HeathKit獲得數(shù)據(jù)的權(quán)限。
//要求連接
hkHealthStore.requestAuthorizationToShareTypes(healthKitTypesToWrite as? Set<HKSampleType>, readTypes: healthKitTypesToRead as? Set<HKObjectType>) { (success, error) -> Void in
if completion != nil{
completion(success:success,error:error)
}
return
}
如果當前裝備支持HeathKit的時候,這樣就會彈出1個要求界面,讓用戶選擇是不是同意你能夠獲得到你要要求的數(shù)據(jù)。
獲得特點信息
我們首先創(chuàng)建了ProfileViewController.swift
,并用IB創(chuàng)建1個要求個人信息的界面

然后在HeathManager.Swift
文件中添加要求個人信息的方法。
對要求特點信息,條件上用戶通過健康
添加了誕生日期、性別、血型等特點信息
func readProfile()->(age:Int?,biologicalsex:HKBiologicalSexObject?,bloodType:HKBloodTypeObject?){
//要求年齡
var age:Int?
let birthDay:NSDate;
do {
birthDay = try hkHealthStore.dateOfBirth()
let today = NSDate()
let diff = NSCalendar.currentCalendar().components(.Year, fromDate: birthDay, toDate: today, options: NSCalendarOptions(rawValue: 0))
age = diff.year
}catch {
}
//要求性別
var biologicalSex
:HKBiologicalSexObject?
do {
biologicalSex = try hkHealthStore.biologicalSex()
}catch {
}
//要求血型
var hkbloodType:HKBloodTypeObject?
do {
hkbloodType = try hkHealthStore.bloodType()
}catch{
}
return (age,biologicalSex,hkbloodType)
}
要求體重、身高、BMI的時候,創(chuàng)建另外的方法。
func fetchMostRecentSample(sample:HKSampleType,competion:((HKSample!,NSError!)->Void)!){
//1.創(chuàng)建謂詞
let past = NSDate.distantPast()
let now = NSDate()
let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate: now, options: .None)
//2.創(chuàng)建返回結(jié)果排序的描寫,是降序還是升序的,由于只需要1個結(jié)果,就設(shè)定限制為1個
let sortDescrptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate , ascending: false)
let limit = 1
//3.創(chuàng)建HKSampleQuery對象,
let sampleQuery = HKSampleQuery(sampleType: sample, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescrptor]) { (sampleQuery, results, error) -> Void in
if let queryError = error {
competion(nil,queryError)
return
}
let mostRecentSample = results?.first
if competion != nil{
competion(mostRecentSample,nil)
}
}
//4.履行查詢
self.hkHealthStore.executeQuery(sampleQuery)
}
獲得以后在之前創(chuàng)建的ProfileViewController.swift
文件中獲得這些信息,并更新UI。
對應(yīng)特點信息,可以直接調(diào)用查詢方法,并更新
let profile = healthManager?.readProfile()
self.healthStore = HKHealthStore()
ageLabel.text = profile?.age == nil ? kUnKnowString:String(profile!.age!)
sexLabel.text = biologicSexLiteral(profile?.biologicalsex?.biologicalSex)
bloodTypeLabel.text = bloodTypeLiteral(profile?.bloodType?.bloodType)
這里面創(chuàng)建了兩個工具方法biologicSexLiteral
和bloodTypeLiteral
來修改查詢的結(jié)果為我們想要的模樣并顯示在界面上。
對體重和身高,需要創(chuàng)建樣本查詢
/**
獲得并更新體重
*/
func updateWeight(){
let weightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)
self.healthManager?.fetchMostRecentSample(weightSampleType!, competion: { (mostRecentSample, error) -> Void in
if error != nil {
return
}
var weightString = self.kUnKnowString
self.weight = mostRecentSample as? HKQuantitySample
//根據(jù)我們想要的數(shù)據(jù)類型單位獲得對應(yīng)的結(jié)果
if let kilograms = self.weight?.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(HKMetricPrefix.Kilo)){
//體重格式化
let weightFommater = NSMassFormatter()
weightFommater.forPersonMassUse = true
weightString = weightFommater.stringFromKilograms(kilograms)
}
//由于這個查詢默許是異步查詢的,所以需要在主線程更新UI
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.weightLabel.text = weightString
self.updateBMILabel()
}
})
}
/**
獲得并更新身高
*/
func updateHeight(){
//設(shè)置要查找的類型,根據(jù)標識符
let heightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeight)
//獲得身高樣本
self.healthManager?.fetchMostRecentSample(heightSampleType!, competion: { (heightSample, error) -> Void in
if error != nil {
return
}
var heightStr = self.kUnKnowString
self.height = heightSample as? HKQuantitySample
//根據(jù)我們想要的數(shù)據(jù)類型單位獲得對應(yīng)的結(jié)果
if let kilograms = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit()){
heightStr = String(format: "%.2f", kilograms) + "m"
}
//由于這個查詢默許是異步查詢的,所以需要在主線程更新UI
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.heightLabel.text = heightStr
self.updateBMILabel()
}
})
}
對應(yīng)BMI,它代表人的身體質(zhì)量指數(shù),它的計算方式是:體重/(身高*身高)。因此它可以這樣取得
/**
獲得并設(shè)置BMI:
*/
func updateBMILabel(){
//根據(jù)我們想要的數(shù)據(jù)類型單位獲得對應(yīng)的結(jié)果
let weight = self.weight?.quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(HKMetricPrefix.Kilo))
let height = self.height?.quantity.doubleValueForUnit(HKUnit.meterUnit())
var bmiValue = 0.0
if height == 0{
return
}
dispatch_async(dispatch_get_main_queue()) { () -> Void in
bmiValue = (weight!)/(height! * height!)
self.BMILabel.text = String(format: "%.02f", bmiValue)
}
}
添加BMI到HeathStore
在下面的方法中添加1個alertView
讓用戶輸入BMI值,然后點擊確認按鈕以后添加到HeathStore
中
@IBAction func addBMIData2HealthStore(sender: AnyObject) {
let alertView = UIAlertController(title: "輸入BMI值", message: nil, preferredStyle: .Alert)
alertView.addTextFieldWithConfigurationHandler { (textField) -> Void in
textField.keyboardType = .NumberPad
}
let action = UIAlertAction(title: "添加", style: .Default) { (action) -> Void in
var value:Double?
if let text = alertView.textFields?.first?.text {
if text.characters.count > 0 {
value = Double(text)
self.saveBMI2HealthStore(value!)
}
}
}
alertView.addAction(action)
self .presentViewController(alertView, animated: true, completion: nil)
}
//保存BMI到heathKitStore中
func saveBMI2HealthStore(height:Double){
//BMI的類型
let BMIType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMassIndex)
//根據(jù)標識符對應(yīng)的單位創(chuàng)建BMI的數(shù)量對象
let BMIQuantity = HKQuantity(unit: HKUnit.countUnit(), doubleValue: height)
let now = NSDate()
//根據(jù)起止時間和上面創(chuàng)建的創(chuàng)建HKQuantity對象創(chuàng)建數(shù)量樣本
let BMISample = HKQuantitySample(type: BMIType!, quantity: BMIQuantity, startDate: now, endDate: now)
//保存數(shù)量樣本到healthStore中
self.healthStore?.saveObject(BMISample, withCompletion: { (success, error) -> Void in
if success {
print("添加成功")
self.updateWeight()
}
if (error != nil) {
print("添加失敗")
}
})
}
如果添加成功,你就能夠去手機上的健康
查找BMI,就能夠看到我們剛才添加的BMI值,而且它的來源是我們創(chuàng)建的app。
獲得HKWorkout
創(chuàng)建1個WorkOutsViewController.swift
文件,并在SB中拖對應(yīng)的IB文件,界面以下

然后在在HeathManager.Swift
文件中添加要求workout的方法
/**
獲得workoutData
*/
func fetchWorkOutsData(completion:([AnyObject]!,NSError!)->Void){
let workOutsSampleType = HKSampleType.workoutType()
let workOutsPredicate = HKQuery.predicateForWorkoutsWithWorkoutActivityType(.Running)
let sortDescrptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate , ascending: false)
let workOutsQuery = HKSampleQuery(sampleType: workOutsSampleType, predicate: workOutsPredicate, limit: 0, sortDescriptors: [sortDescrptor]) { (workoutsQuery, results, error) -> Void in
if (error != nil){
print("獲得失敗")
return
}
if results != nil{
completion(results!,nil)
}
}
self.hkHealthStore.executeQuery(workOutsQuery)
}
然后在WorkOutsViewController.swift
文件的viewWillAppear()
方法中要求workout
self.healthManager?.fetchWorkOutsData({ (results, error) -> Void in
if error != nil{
print("獲得失敗")
}else{
self.workOuts = results as! [HKWorkout]
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
});
})
最后在tableView顯示以下

保存HKWorkout
在上面的界面的NavgationBar
的rightBarItem
向下再拖1個控制器,并添加對應(yīng)的文件AddWorkoutsViewController.swift
,并在IB中設(shè)置界面信息以下

然后在 AddWorkoutsViewController.swift
復(fù)寫 tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
,針對點擊不同的cell,履行不同的方法。即讓用戶輸入點擊的cell對應(yīng)的輸入方式,比如時間就是時間選擇器。距離就是1個警示框加1個文本框等。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
self.tableView.tableFooterView = UIView()
switch indexPath.row{
case 0:
self.setupPickerView()
case 1,2:
self.setupDatePickerView(indexPath.row)
case 3,4:
self.setupAlertView(indexPath.row)
default:
break
}
}
這里面對應(yīng)的選擇的方法就不逐一介紹了,就是幾個普通的view的添加。添加完所有的信息以后就能夠點擊done
保存信息,方法以下:
@IBAction func addWorkOut(sender: AnyObject) {
self.heathStore = HKHealthStore()
//獲得距離和能量的數(shù)值
let distanceValue = Double(self.distanceLabel.text!)
let energyValue = Double(self.energyLabel.text!)
//根據(jù)上面的數(shù)值創(chuàng)建對應(yīng)的HKQuantity對象
let distance = HKQuantity(unit: HKUnit.mileUnit(), doubleValue: distanceValue!)
let energy = HKQuantity(unit: HKUnit.calorieUnit(), doubleValue: energyValue!)
let endDate = self.dateFommater?.dateFromString(self.endDateLabel.text!)
let startDate = self.dateFommater?.dateFromString(self.startDateLabel.text!)
//這里我默許設(shè)置成running了。可以根據(jù)具體的類型再進行設(shè)置。
//創(chuàng)建HKWorkout對象。
let workout = HKWorkout(activityType: .Running, startDate: startDate!, endDate: endDate!, workoutEvents: nil, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
//保存上面創(chuàng)建的HKWorkout對象
self.heathStore?.saveObject(workout, withCompletion: { (success, error) -> Void in
if error != nil{
print("添加毛病")
return
}
if success{
print("添加成功")
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.dismissViewControllerAnimated(true, completion: nil)
})
}
})
}
如果上面都履行成功,AddWorkoutsViewController.swift
就會模態(tài)消失,然后在上面的1個頁面`WorkOutsViewController.swift
就會在tableView的最上層顯示出我們剛才添加成功的HKWorkout
總結(jié)
在本人過完春節(jié)回到公司上班以后經(jīng)理問我健康
app里面的信息能不能獲得到。之前只是簡單了解了這個框架,但是里面的具體結(jié)構(gòu)體系其實不了解。就趁著項目不忙,抽空把HeathKit學習了解了1下。本文的demo也采取了之前自學的Swift簡單的實現(xiàn)了1下(屬于Switer新手)。可能會有毛病或不準確的地方,如果你看到了,可以給我聯(lián)系ls_xyq@126.com,我會及時更改的。寫這篇文章1是對HeathKit的學習的1個練習,在這也是賜與后會用到的童鞋1個可以參考的東西。
HeathKit不只是上面的這些內(nèi)容,但是能把上面的這些問題弄定,我覺得針對HeathKit的體系會有1個清楚的認識,學習HeathKit更深層次的內(nèi)容會有很大的幫助。
本文的demo已放到github上面,需要的同學可以下載看看。
本文參考文章:
- HealthKit框架參考
- HealthKit開發(fā)教程Swift版
- The HealthKit Framework
逐日更新關(guān)注:http://weibo.com/hanjunqiang 新浪微博!iOS開發(fā)者交換QQ群: 446310206
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈