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項(xiàng)
2、項(xiàng)目中: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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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