iOS HealthKit筆記
iOS HealthKit框架使用
- 如何使項(xiàng)目能夠使用HealthKit
- 獲取讀取和寫入healthKit數(shù)據(jù)的權(quán)限
- 讀取healthKit的數(shù)據(jù)
- 寫入HealthKit數(shù)據(jù)
- 對(duì)HealthKit數(shù)據(jù)進(jìn)行格式化.
HealthKit 是什么東西.
- HealthKit框架提供了一個(gè)結(jié)構(gòu),應(yīng)用可以使用它來分享健康和健身數(shù)據(jù)
- 簡(jiǎn)單的說. HealthKit框架用來與蘋果的健康應(yīng)用做數(shù)據(jù)交互. 例如可以從HealthKit中讀取用戶的記步數(shù)據(jù). 向蘋果的健康應(yīng)用中寫入用戶的血糖, 血壓, 心跳等數(shù)據(jù).
如何使項(xiàng)目能夠使用HealthKit
首先你的開發(fā)者賬號(hào)的Bundle identifier需要能夠使用healthKit.
在Target中設(shè)置healthKit開啟
獲取讀取和寫入HealthKit數(shù)據(jù)的權(quán)限
這句判斷healthStore是否可用,只有iOS8以上的版本才有healthKit
[HKHealthStore isHealthDataAvailable];
獲取權(quán)限.兩個(gè)參數(shù)分別是寫權(quán)限和讀權(quán)限,類型為NSSet
可以一次獲取許多種權(quán)限例如身高體重血壓血糖,執(zhí)行這句后自動(dòng)彈出頁面,用戶自主選擇授權(quán).
[self.healthStore requestAuthorizationToShareTypes: readTypes: completion:^(BOOL success, NSError *error)]{
}];
HKQuantityType(查詢的數(shù)據(jù)類型)的創(chuàng)建
HKQuantityTyoeIdentifierBloodGlucose表示血糖,在HealthKit/HKTypeIdentifiers.h文件中存儲(chǔ)了全部的healthKit數(shù)據(jù)類型的定義,使用這些identifier來構(gòu)造HKQuantityType
HKQuantityType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodGlucose];
讀取HealthKit數(shù)據(jù)
讀取使用HKSampleQuery對(duì)象進(jìn)行查詢,
參數(shù)介紹:
SampleType:使用HKQuantityType進(jìn)行封裝,表示查詢的數(shù)據(jù)的類型, predicate:表示過濾方式,可以傳nil, limit:查詢返回的數(shù)據(jù)數(shù)量,可以為1, sortDescriptors:排序方式
NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];
返回?cái)?shù)據(jù)results,result為HKQuantitySample類型
數(shù)據(jù)包含數(shù)值和單位,數(shù)據(jù)單位的類型是HKUnit類型,這個(gè)類包含許多的類型,如長度,質(zhì)量,體積,壓力等等,但是像血糖這種毫克/分升或者毫摩>>爾/升,這種單位沒有直接提供,但是有個(gè)方法能夠通過HKQuantityType獲取它的HKUnit
HKSampleQuery *query = [HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:limit sortDescriptors:descriptor resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error){
//對(duì)result進(jìn)行解析
HKQuantitySample *sample = resluts.firstObject;
HKQuantity *quantity = sample.quantity;
}];
[self.healthStore executeQuery:query];
[quantity doubleValueWithUnit:此處構(gòu)造一個(gè)合適的HKUnit];
構(gòu)造HKUnit
[self.healthStore preferredUnitsForQuantityTypes: completion:^(NSDictionary *preferredUnits, NSError *error){
self.unit = [preferredUnits objectForKey:[HKQuantityType alloc initWithXXXXXXX]];
}];
上面的方法的參數(shù)是HKQuantityType
返回的HKUnit可以解析HKQuantity,
獲取HKQuantity的數(shù)值:
[ doubleValueForUnit:];
使用某個(gè)單位獲取數(shù)值
寫入數(shù)據(jù)(以血糖數(shù)據(jù)為例)
參數(shù)說明:
這句使用類型和數(shù)量還有時(shí)間封裝一個(gè)HKQuantitySample,只有HKQuantitySample可以被直接保存到HealthKit中
參數(shù)說明 HKQuantityType quantity HKQuantity
HKQuantity的構(gòu)造使用單位和數(shù)值兩部分.
HKQuantitySample *sugarSample = [HKQuantitySample quantitySampleWithType: quantity startDate: endDate:];
構(gòu)造單位
[self.healthStore preferredUnitsForQuantityTypes]
HKQuantity *quantity = [HKQuantity quantityWithUnit:self.unit doubleValue:[self.gugarValueTextField.text doubleValue]];
存儲(chǔ)數(shù)據(jù)(寫入數(shù)據(jù)):
[self.healthStore saveObject:sugarSample withCompletion:^(BOOL success, NSError *error){
if(!success){
abort();
}
}];
數(shù)據(jù)格式化
首先保存和取出的數(shù)據(jù)類型都是HKQuantitySample
- HKQuantitySample使用HKQuantity和HKQuantityType構(gòu)造而成
- HKQuantity使用HKUnit和具體的數(shù)值構(gòu)造而成.
- HKQuantityType使用常量字符串構(gòu)造例如
HKQuantityTypeIdentifierBloodGlucose - HKUnit使用類方法或者HKQuantityType及[self.healthStore preferredUnitsForQuantityTypes:]方法構(gòu)造而出.
使用字符串構(gòu)造HKUnit
注意下面的字符串蘋果的文檔中并沒有提供,180.1558800000541這個(gè)數(shù)值百度為空,使用這個(gè)字符串構(gòu)造HKUnit不知道算不算使用了私有API(這個(gè)字符串是我打印對(duì)象打出來的)
這里構(gòu)造了一個(gè)血糖的單位. 毫摩爾/升 毫克/分升
HKUnit *unit = [HKUnit unitFromString:@"mmol<180.1558800000541>/L"];
HKUnit *unit = [HKUnit unitFromString:@"mg/dl"];
直接使用字符串構(gòu)造出的Unit方便簡(jiǎn)答,只需要記錄不同的單位所對(duì)應(yīng)的字符串,毫摩爾每升這個(gè)單位對(duì)應(yīng)的字符串實(shí)在是奇葩,百度搜這串?dāng)?shù)字直接空白.使用HKUnit對(duì)取出的數(shù)據(jù)進(jìn)行格式化免去了手動(dòng)單位換算的麻煩,據(jù)說毫摩爾每升乘以18就是毫克每分升.
上面多數(shù)是以血糖數(shù)據(jù)舉例, 同理可以查詢寫入記步數(shù)據(jù), 心率, 血壓, 等等. 配合蘋果手表, 電子血糖儀, 血壓計(jì), 等外設(shè)可以自動(dòng)監(jiān)測(cè)并寫入數(shù)據(jù)到蘋果健康應(yīng)用中.
附錄 HealthKit框架體系.
類名 | 翻譯 |
---|---|
NSObject | 基類 |
HKBiologicalSexObject | 枚舉類型 性別 |
HKBloodTypeObject | 枚舉 血型 |
HKHealthStore | 管理數(shù)據(jù) |
HKObject | HealthKit數(shù)據(jù)的基類 |
HKSample | 樣本,代表了有開始時(shí)間和結(jié)束時(shí)間相關(guān)的數(shù)據(jù). |
HKCategorySample | 狀態(tài)樣本 |
HKCorrelation | 復(fù)合數(shù)據(jù)樣本 |
HKQuantitySample | 數(shù)據(jù)樣本 |
HKWorkout | 健身樣本 |
HKObjectType | 表示數(shù)據(jù)的類型如血糖數(shù)據(jù)?身高數(shù)據(jù)?血壓數(shù)據(jù)? |
HKCharacteristicType | |
HKSampleType | |
HKCategoryType | |
……. | |
HKQuantity | 某一種數(shù)據(jù)單位的數(shù)量 |
HKQuery | 謂詞對(duì)象 |
HKAnchoredObjectQuery | 錨查詢 |
HKCorrelationQuery | 復(fù)合數(shù)據(jù)查詢 |
HKObserverQuery | 觀察者查詢 |
HKSampleQuery | 樣本查詢 |
HKSourceQuery | 數(shù)據(jù)來源查詢 |
HKStatisticsCollectionQuery | 統(tǒng)計(jì)集合查詢 |
HKStatisticsQuery | 統(tǒng)計(jì)查詢 |
HKSource | 數(shù)據(jù)來源對(duì)象 |
HKStatistics | 統(tǒng)計(jì)對(duì)象 |
HKStatisticsCollection | 統(tǒng)計(jì)集合對(duì)象 |
HKUnit | 基本的數(shù)據(jù)單位 |
HKWorkoutEvent | 健身時(shí)間 |
轉(zhuǎn)發(fā)請(qǐng)注明出處(簡(jiǎn)書 行如風(fēng)).