iOS HealthKit 使用簡介

介紹

使用HealthKit之前先了解讀取數(shù)據(jù)和寫入數(shù)據(jù)時需要用到的幾個關(guān)鍵類:
1洽洁、授權(quán)相關(guān)

  • HKHealthStore (判斷是否已經(jīng)獲取授權(quán)、申請權(quán)限)

2、數(shù)據(jù)類型

  • HKObjectType (數(shù)據(jù)類型抽象類)
    • HKSampleType (繼承HKObjectType存崖,具體數(shù)據(jù)類型類静暂,用來表示身高聊倔、體重晦毙、心率等具體的數(shù)據(jù)類型)
    • HKQuantityType (具體數(shù)值類型類)

3、數(shù)據(jù)查詢

  • HKQuery (數(shù)據(jù)查詢基類)
    • HKSampleQuery (根據(jù)HKSampleType具體數(shù)據(jù)類型耙蔑、NSPredicate篩選见妒、NSSortDescriptor排序查詢數(shù)據(jù))

4、model

  • HKObject (數(shù)據(jù)model基類)
    • HKSample (繼承HKObject甸陌,記錄數(shù)據(jù)類型须揣、時間等)
      • HKQuantitySample (繼承HKSample,記錄HKQuantityType數(shù)值類型類钱豁、HKQuantity數(shù)值類)
  • HKQuantity (數(shù)值類)

獲取授權(quán)

1耻卡、創(chuàng)建證書時,勾選Health項
2牲尺、項目中:targets --> Capabilities --> HealthKit


authorization.png

3卵酪、代碼

//導(dǎo)入頭文件
 #import <HealthKit/HealthKit.h>
//使用前,先判斷是否授權(quán)
+ (BOOL)isHealthDataAvailable;
/*
  申請權(quán)限
  shareTypes  :數(shù)據(jù)寫入權(quán)限
  readTypes   :數(shù)據(jù)讀取權(quán)限
**/
- (void)requestAuthorizationToShareTypes:(nullable NSSet<HKSampleType *> *)typesToShare
                               readTypes:(nullable NSSet<HKObjectType *> *)typesToRead
                              completion:(void (^)(BOOL success, NSError * _Nullable error))completion;

//使用
if (!self.healthStore) {
  self.healthStore = [[HKHealthStore alloc] init];
}

HKQuantityType *heightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
NSSet *typesSet = [NSSet setWithObjects:heightType, nil];
//申請身高的讀取和寫入權(quán)限
[self.healthStore requestAuthorizationToShareTypes:typesSet readTypes:typesSet completion:^(BOOL success, NSError * _Nullable error) {
  if (success) {
    //獲得權(quán)限之后谤碳,讀取數(shù)據(jù)
    [self readData];
  } else {
    //您可以在設(shè)置--隱私--健康中允許應(yīng)用讀取健康數(shù)據(jù)
  }
}];

數(shù)據(jù)讀取

- (void)readData {
    //身高 CM
    HKSampleType *heightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    //NSSortDescriptor用來對數(shù)據(jù)進(jìn)行排序
    NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];
    NSSortDescriptor *end = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];
    
    //此處按時間篩選  開始時間到結(jié)束時間溃卡,自定義
    NSDate *date = [NSDate date];
    NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:date endDate:date options:(HKQueryOptionNone)];

    HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:type predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[start, end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {
        //循環(huán)獲取得到的數(shù)據(jù)
        for (int i = 0; i < results.count; i ++) {
            //把結(jié)果轉(zhuǎn)換為字符串類型
            HKQuantitySample *result = results[i];
            HKQuantity *quantity = result.quantity;
            //此處可以輸出quantity數(shù)據(jù) (帶單位信息)
            NSLog(@"quantity = %@", quantity);
          
            //通過單位解析值類型,這里需要獲取以CM為單位的身高數(shù)據(jù)蜒简,所以單位信息為[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti]
            //單位信息可參照HKUnit類瘸羡,文章下面有簡單介紹
            CGFloat value = [quantity doubleValueForUnit:[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti]];
        }
    }];

    //******執(zhí)行查詢******
    [self.healthStore executeQuery:sampleQuery];

}
關(guān)于數(shù)據(jù)單位HKUnit

HKUnit中有豐富的數(shù)據(jù)單位類型:
Mass Units 質(zhì)量單位
Length Units 長度單位
Volume Units 體積單位
Pressure Units 壓力單位
Time Units 時間單位
Energy Units 能量單位
Temperature Units 溫度單位
Electrical Conductance Units 電導(dǎo)率單位
Pharmacology Units 藥理學(xué)單位
Scalar Units 標(biāo)量單位(包括百分比)

HKMetricPrefix 枚舉類型 10^-12 ~ 10^12

例子:
①身高 -- CM

//以米為單位:
[HKUnit meterUnit]
//以厘米為單位(是在以米為單位的基礎(chǔ)上計算,所以使用10^-2):
[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti]

②體重 -- KG

//以千克為單位
[HKUnit gramUnitWithMetricPrefix:(HKMetricPrefixKilo)]

③BMI -- count

//float類型
[HKUnit countUnit]

④體脂肪率 -- %

//百分比單位
[HKUnit percentUnit]

⑤血壓收縮壓 -- mmHg

[HKUnit millimeterOfMercuryUnit]

⑥安靜心率 -- count/min

//心率是一分鐘多少次搓茬,沒有具體的單位犹赖,所以可以直接使用字符串來構(gòu)造單位
//在查詢結(jié)果回調(diào)中 輸出HKQuantity可以查看到單位信息
[HKUnit unitFromString:@"count/min"]

⑦最大肺活量 -- ML

//默認(rèn)是公升為單位,這里要獲取毫升單位垮兑,所以使用10^-3
[HKUnit literUnitWithMetricPrefix:HKMetricPrefixMilli]
關(guān)于HKSampleType樣本類型
  • 身體測量
1. HKQuantityTypeIdentifierBodyMassIndex  身高體重指數(shù)
2. HKQuantityTypeIdentifierBodyFatPercentage 體脂率
3. HKQuantityTypeIdentifierHeight 身高
4. HKQuantityTypeIdentifierBodyMass 體重
5. HKQuantityTypeIdentifierLeanBodyMass 去脂體重
  • 健身數(shù)據(jù)
1. HKQuantityTypeIdentifierStepCount  步數(shù)
2. HKQuantityTypeIdentifierDistanceWalkingRunning 步行+跑步距離
3. HKQuantityTypeIdentifierDistanceCycling 騎車距離
4. HKQuantityTypeIdentifierBasalEnergyBurned 靜息能量
5. HKQuantityTypeIdentifierActiveEnergyBurned 活動能量
6. HKQuantityTypeIdentifierFlightsClimbed 已爬樓層

//不允許share
7. HKQuantityTypeIdentifierNikeFuel NikeFuel
8. HKQuantityTypeIdentifierAppleExerciseTime  鍛煉分鐘數(shù)健身數(shù)據(jù)
  • 主要特征
1. HKQuantityTypeIdentifierHeartRate 心率
2. HKQuantityTypeIdentifierBodyTemperature  體溫
3. HKQuantityTypeIdentifierBasalBodyTemperature 基礎(chǔ)體溫
4. HKQuantityTypeIdentifierBloodPressureSystolic  收縮壓
5. HKQuantityTypeIdentifierBloodPressureDiastolic  舒張壓
6. HKQuantityTypeIdentifierRespiratoryRate  呼吸速率
  • 數(shù)據(jù)結(jié)果
1. HKQuantityTypeIdentifierOxygenSaturation  血氧飽和度
2. HKQuantityTypeIdentifierPeripheralPerfusionIndex 末梢灌注指數(shù)
3. HKQuantityTypeIdentifierBloodGlucose 血糖
4. HKQuantityTypeIdentifierNumberOfTimesFallen 摔倒次數(shù)
5. HKQuantityTypeIdentifierElectrodermalActivity  皮電活動
6. HKQuantityTypeIdentifierInhalerUsage 吸入劑用量
7. HKQuantityTypeIdentifierBloodAlcoholContent  血液酒精濃度
8. HKQuantityTypeIdentifierForcedVitalCapacity  最大肺活量|用力肺活量
9. HKQuantityTypeIdentifierForcedExpiratoryVolume1 第一秒用力呼氣量
10.HKQuantityTypeIdentifierPeakExpiratoryFlowRate 呼氣流量峰值
  • 營養(yǎng)攝入
1. HKQuantityTypeIdentifierDietaryFatTotal 總脂肪
2. HKQuantityTypeIdentifierDietaryFatPolyunsaturated  多元不飽和脂肪
3. HKQuantityTypeIdentifierDietaryFatMonounsaturated 單元不飽和脂肪
4. HKQuantityTypeIdentifierDietaryFatSaturated 飽和脂肪
5. HKQuantityTypeIdentifierDietaryCholesterol 膳食膽固醇
6. HKQuantityTypeIdentifierDietarySodium 鈉
7. HKQuantityTypeIdentifierDietaryCarbohydrates 碳水化合物
8. HKQuantityTypeIdentifierDietaryFiber 纖維
9. HKQuantityTypeIdentifierDietarySugar 膳食糖
10.HKQuantityTypeIdentifierDietaryEnergyConsumed  膳食能量
11.HKQuantityTypeIdentifierDietaryProtein 蛋白質(zhì)
12.HKQuantityTypeIdentifierDietaryVitaminA 維生素 A
13.HKQuantityTypeIdentifierDietaryVitaminB6 維生素 B6
14.HKQuantityTypeIdentifierDietaryVitaminB12 維生素 B12
15.HKQuantityTypeIdentifierDietaryVitaminC 維生素 C
16.HKQuantityTypeIdentifierDietaryVitaminD 維生素 D
17.HKQuantityTypeIdentifierDietaryVitaminE 維生素 E
18.HKQuantityTypeIdentifierDietaryVitaminK 維生素 K
19.HKQuantityTypeIdentifierDietaryCalcium  鈣
20.HKQuantityTypeIdentifierDietaryIron 鐵
21.HKQuantityTypeIdentifierDietaryThiamin 硫銨
22.HKQuantityTypeIdentifierDietaryRiboflavin 核黃素
23.HKQuantityTypeIdentifierDietaryNiacin 煙酸
24.HKQuantityTypeIdentifierDietaryFolate 葉酸
25.HKQuantityTypeIdentifierDietaryBiotin 生物素
26.HKQuantityTypeIdentifierDietaryPantothenicAcid 泛酸
27.HKQuantityTypeIdentifierDietaryPhosphorus 磷
28.HKQuantityTypeIdentifierDietaryIodine 碘
29.HKQuantityTypeIdentifierDietaryMagnesium 鎂
30.HKQuantityTypeIdentifierDietaryZinc 鋅
31.HKQuantityTypeIdentifierDietarySelenium 硒
32.HKQuantityTypeIdentifierDietaryCopper 銅
33.HKQuantityTypeIdentifierDietaryManganese 錳
34.HKQuantityTypeIdentifierDietaryChromium 鉻
35.HKQuantityTypeIdentifierDietaryMolybdenum 鉬
36.HKQuantityTypeIdentifierDietaryChloride 氯化物
37.HKQuantityTypeIdentifierDietaryPotassium 鉀
38.HKQuantityTypeIdentifierDietaryCaffeine 咖啡因
39.HKQuantityTypeIdentifierDietaryWater 水
40.HKQuantityTypeIdentifierUVExposure 紫外線指數(shù)

數(shù)據(jù)寫入

以身高為例

#pragma mark - 寫入身高數(shù)據(jù)
//寫入數(shù)據(jù)之前冷尉,注意要先申請寫入權(quán)限
- (void)writeData {
    //身高具體數(shù)值類型
    HKQuantityType *heightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    HKQuantity *heightQuantity = [HKQuantity quantityWithUnit:[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti] doubleValue:181];
    
    //當(dāng)前日期
    NSDate *today = [NSDate date];
    
    //身高數(shù)值類
    HKQuantitySample *heightSample = [HKQuantitySample quantitySampleWithType:heightType quantity:heightQuantity startDate:today endDate:today];
    
    [self.healthStore saveObject:heightSample withCompletion:^(BOOL success, NSError * _Nullable error) {
        NSLog(@"write success");
    }];
}

文章中漱挎,關(guān)于HKSampleType樣本類型系枪,參考自
蕭雪痕

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磕谅,隨后出現(xiàn)的幾起案子私爷,更是在濱河造成了極大的恐慌,老刑警劉巖膊夹,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衬浑,死亡現(xiàn)場離奇詭異,居然都是意外死亡放刨,警方通過查閱死者的電腦和手機(jī)工秩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人助币,你說我怎么就攤上這事浪听。” “怎么了眉菱?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵迹栓,是天一觀的道長。 經(jīng)常有香客問我俭缓,道長克伊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任华坦,我火速辦了婚禮愿吹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惜姐。我一直安慰自己洗搂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布载弄。 她就那樣靜靜地躺著耘拇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宇攻。 梳的紋絲不亂的頭發(fā)上惫叛,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音逞刷,去河邊找鬼嘉涌。 笑死,一個胖子當(dāng)著我的面吹牛夸浅,可吹牛的內(nèi)容都是我干的仑最。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼帆喇,長吁一口氣:“原來是場噩夢啊……” “哼警医!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坯钦,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤预皇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后婉刀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吟温,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年突颊,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲁豪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潘悼。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爬橡,靈堂內(nèi)的尸體忽然破棺而出挥等,到底是詐尸還是另有隱情,我是刑警寧澤堤尾,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布肝劲,位于F島的核電站,受9級特大地震影響郭宝,放射性物質(zhì)發(fā)生泄漏辞槐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一粘室、第九天 我趴在偏房一處隱蔽的房頂上張望榄檬。 院中可真熱鬧,春花似錦衔统、人聲如沸鹿榜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舱殿。三九已至,卻和暖如春险掀,著一層夾襖步出監(jiān)牢的瞬間沪袭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工樟氢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留冈绊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓埠啃,卻偏偏與公主長得像死宣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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