介绍
使用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
3、代码
//导入头文件
#import
//使用前,先判断是否授权
+ (BOOL)isHealthDataAvailable;
/*
申请权限
shareTypes :数据写入权限
readTypes :数据读取权限
**/
- (void)requestAuthorizationToShareTypes:(nullable NSSet *)typesToShare
readTypes:(nullable NSSet *)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样本类型,参考自
萧雪痕