iOS HealthKit 使用简介

介绍

使用HealthKit之前先了解读取数据和写入数据时需要用到的几个关键类:
1、授权相关

  • HKHealthStore (判断是否已经获取授权、申请权限)

2、数据类型

  • HKObjectType (数据类型抽象类)
    • HKSampleType (继承HKObjectType,具体数据类型类,用来表示身高、体重、心率等具体的数据类型)
    • HKQuantityType (具体数值类型类)

3、数据查询

  • HKQuery (数据查询基类)
    • HKSampleQuery (根据HKSampleType具体数据类型、NSPredicate筛选、NSSortDescriptor排序查询数据)

4、model

  • HKObject (数据model基类)
    • HKSample (继承HKObject,记录数据类型、时间等)
      • HKQuantitySample (继承HKSample,记录HKQuantityType数值类型类、HKQuantity数值类)
  • HKQuantity (数值类)

获取授权

1、创建证书时,勾选Health项
2、项目中:targets --> Capabilities --> HealthKit


authorization.png

3、代码

//导入头文件
 #import <HealthKit/HealthKit.h>
//使用前,先判断是否授权
+ (BOOL)isHealthDataAvailable;
/*
  申请权限
  shareTypes  :数据写入权限
  readTypes   :数据读取权限
**/
- (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];
//申请身高的读取和写入权限
[self.healthStore requestAuthorizationToShareTypes:typesSet readTypes:typesSet completion:^(BOOL success, NSError * _Nullable error) {
  if (success) {
    //获得权限之后,读取数据
    [self readData];
  } else {
    //您可以在设置--隐私--健康中允许应用读取健康数据
  }
}];

数据读取

- (void)readData {
    //身高 CM
    HKSampleType *heightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    //NSSortDescriptor用来对数据进行排序
    NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];
    NSSortDescriptor *end = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];
    
    //此处按时间筛选  开始时间到结束时间,自定义
    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) {
        //循环获取得到的数据
        for (int i = 0; i < results.count; i ++) {
            //把结果转换为字符串类型
            HKQuantitySample *result = results[i];
            HKQuantity *quantity = result.quantity;
            //此处可以输出quantity数据 (带单位信息)
            NSLog(@"quantity = %@", quantity);
          
            //通过单位解析值类型,这里需要获取以CM为单位的身高数据,所以单位信息为[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti]
            //单位信息可参照HKUnit类,文章下面有简单介绍
            CGFloat value = [quantity doubleValueForUnit:[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti]];
        }
    }];

    //******执行查询******
    [self.healthStore executeQuery:sampleQuery];

}
关于数据单位HKUnit

HKUnit中有丰富的数据单位类型:
Mass Units 质量单位
Length Units 长度单位
Volume Units 体积单位
Pressure Units 压力单位
Time Units 时间单位
Energy Units 能量单位
Temperature Units 温度单位
Electrical Conductance Units 电导率单位
Pharmacology Units 药理学单位
Scalar Units 标量单位(包括百分比)

HKMetricPrefix 枚举类型 10^-12 ~ 10^12

例子:
①身高 -- CM

//以米为单位:
[HKUnit meterUnit]
//以厘米为单位(是在以米为单位的基础上计算,所以使用10^-2):
[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti]

②体重 -- KG

//以千克为单位
[HKUnit gramUnitWithMetricPrefix:(HKMetricPrefixKilo)]

③BMI -- count

//float类型
[HKUnit countUnit]

④体脂肪率 -- %

//百分比单位
[HKUnit percentUnit]

⑤血压收缩压 -- mmHg

[HKUnit millimeterOfMercuryUnit]

⑥安静心率 -- count/min

//心率是一分钟多少次,没有具体的单位,所以可以直接使用字符串来构造单位
//在查询结果回调中 输出HKQuantity可以查看到单位信息
[HKUnit unitFromString:@"count/min"]

⑦最大肺活量 -- ML

//默认是公升为单位,这里要获取毫升单位,所以使用10^-3
[HKUnit literUnitWithMetricPrefix:HKMetricPrefixMilli]
关于HKSampleType样本类型
  • 身体测量
1. HKQuantityTypeIdentifierBodyMassIndex  身高体重指数
2. HKQuantityTypeIdentifierBodyFatPercentage 体脂率
3. HKQuantityTypeIdentifierHeight 身高
4. HKQuantityTypeIdentifierBodyMass 体重
5. HKQuantityTypeIdentifierLeanBodyMass 去脂体重
  • 健身数据
1. HKQuantityTypeIdentifierStepCount  步数
2. HKQuantityTypeIdentifierDistanceWalkingRunning 步行+跑步距离
3. HKQuantityTypeIdentifierDistanceCycling 骑车距离
4. HKQuantityTypeIdentifierBasalEnergyBurned 静息能量
5. HKQuantityTypeIdentifierActiveEnergyBurned 活动能量
6. HKQuantityTypeIdentifierFlightsClimbed 已爬楼层

//不允许share
7. HKQuantityTypeIdentifierNikeFuel NikeFuel
8. HKQuantityTypeIdentifierAppleExerciseTime  锻炼分钟数健身数据
  • 主要特征
1. HKQuantityTypeIdentifierHeartRate 心率
2. HKQuantityTypeIdentifierBodyTemperature  体温
3. HKQuantityTypeIdentifierBasalBodyTemperature 基础体温
4. HKQuantityTypeIdentifierBloodPressureSystolic  收缩压
5. HKQuantityTypeIdentifierBloodPressureDiastolic  舒张压
6. HKQuantityTypeIdentifierRespiratoryRate  呼吸速率
  • 数据结果
1. HKQuantityTypeIdentifierOxygenSaturation  血氧饱和度
2. HKQuantityTypeIdentifierPeripheralPerfusionIndex 末梢灌注指数
3. HKQuantityTypeIdentifierBloodGlucose 血糖
4. HKQuantityTypeIdentifierNumberOfTimesFallen 摔倒次数
5. HKQuantityTypeIdentifierElectrodermalActivity  皮电活动
6. HKQuantityTypeIdentifierInhalerUsage 吸入剂用量
7. HKQuantityTypeIdentifierBloodAlcoholContent  血液酒精浓度
8. HKQuantityTypeIdentifierForcedVitalCapacity  最大肺活量|用力肺活量
9. HKQuantityTypeIdentifierForcedExpiratoryVolume1 第一秒用力呼气量
10.HKQuantityTypeIdentifierPeakExpiratoryFlowRate 呼气流量峰值
  • 营养摄入
1. HKQuantityTypeIdentifierDietaryFatTotal 总脂肪
2. HKQuantityTypeIdentifierDietaryFatPolyunsaturated  多元不饱和脂肪
3. HKQuantityTypeIdentifierDietaryFatMonounsaturated 单元不饱和脂肪
4. HKQuantityTypeIdentifierDietaryFatSaturated 饱和脂肪
5. HKQuantityTypeIdentifierDietaryCholesterol 膳食胆固醇
6. HKQuantityTypeIdentifierDietarySodium 钠
7. HKQuantityTypeIdentifierDietaryCarbohydrates 碳水化合物
8. HKQuantityTypeIdentifierDietaryFiber 纤维
9. HKQuantityTypeIdentifierDietarySugar 膳食糖
10.HKQuantityTypeIdentifierDietaryEnergyConsumed  膳食能量
11.HKQuantityTypeIdentifierDietaryProtein 蛋白质
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 紫外线指数

数据写入

以身高为例

#pragma mark - 写入身高数据
//写入数据之前,注意要先申请写入权限
- (void)writeData {
    //身高具体数值类型
    HKQuantityType *heightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
    HKQuantity *heightQuantity = [HKQuantity quantityWithUnit:[HKUnit meterUnitWithMetricPrefix:HKMetricPrefixCenti] doubleValue:181];
    
    //当前日期
    NSDate *today = [NSDate date];
    
    //身高数值类
    HKQuantitySample *heightSample = [HKQuantitySample quantitySampleWithType:heightType quantity:heightQuantity startDate:today endDate:today];
    
    [self.healthStore saveObject:heightSample withCompletion:^(BOOL success, NSError * _Nullable error) {
        NSLog(@"write success");
    }];
}

文章中,关于HKSampleType样本类型,参考自
萧雪痕

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容