Health Kit 在IOS上的应用

我们应用内可能会应用苹果自带的健康来读取一些数据,如:每日的步数、活动能量、游泳距离等等。
首先介绍一下 HealthKit, HealthKit是Apple公司在推出iOS 8 系统时一块推出的关于健康信息的框架。如果iPhone手机系统升级到iOS8之后就会发现多了一个健康-app,这就是Apple提供的一个记录用户健康信息的app,可以用它来分享健康和健身数据。还可以指定数据的来源,比如我们自己创建一个app,在我们的app中使用了HealthKit框架之后只要经过用户的认证,就可以在我们的app之中给健康分享数据或者从健康中获取数据。
HealthKit可以与健身设备一起工作,iPhone手机自身可以监控步数信息,会自动导入步数信息。但是其他信息或者设备需要配套的应该才能获取到数据并导入到HealthKit中并在健康中显示。
HealthKit不能再iPad中使用,而且它也不支持扩展。
其次,我们说一下如何使用 HealthKit。

1、在应用中打开 HealthKit功能

Health Kit 在IOS上的应用_第1张图片
打开HealthKit功能

2、在info.plist文件中申请key

Health Kit 在IOS上的应用_第2张图片
权限申请

读取权限 :

Privacy - Health Share Usage Description  

写入权限:

Privacy - Health Update Usage Description 

3、导入#import 框架

4、应用授权

 //HealthKit中的管理者
 HKHealthStore *store = [[HKHealthStore alloc] init];
 //访问权限类型
 HKQuantityType *quType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
NSSet *set = [NSSet setWithObject:quType];
 //参数一是写入操作。参数二是读取操作
 [store requestAuthorizationToShareTypes:set readTypes:set completion:^(BOOL success, NSError * _Nullable error) {
    NSLog(@"success == %d ,error == %@" , success , error);
}];

上面的授权仅仅是可以访问步数,其他的授权还有这些:

1)、数量样本(HKQuantityType)

调用方法 :

[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
  • 身体测量

    1. HKQuantityTypeIdentifierBodyMassIndex  身高体重指数
    2. HKQuantityTypeIdentifierBodyFatPercentage 体脂率
    3. HKQuantityTypeIdentifierHeight 身高
    4. HKQuantityTypeIdentifierBodyMass 体重
    5. HKQuantityTypeIdentifierLeanBodyMass 去脂体重
    

*健身数据

 1. HKQuantityTypeIdentifierStepCount   步数
 2. HKQuantityTypeIdentifierDistanceWalkingRunning  步行+跑步距离
 3. HKQuantityTypeIdentifierDistanceCycling  骑车距离
 4.HKQuantityTypeIdentifierDistanceWheelchair  轮椅距离
 5. HKQuantityTypeIdentifierBasalEnergyBurned  静息能量
 6. HKQuantityTypeIdentifierActiveEnergyBurned  活动能量
 7. HKQuantityTypeIdentifierFlightsClimbed    已爬楼层
 8. HKQuantityTypeIdentifierNikeFuel     NikeFuel
 9. HKQuantityTypeIdentifierAppleExerciseTime  锻炼分钟数健身数据
 10.HKQuantityTypeIdentifierDistanceSwimming  游泳距离
 11.HKQuantityTypeIdentifierSwimmingStrokeCount 游泳冲刺次数

*主要特征

  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 紫外线指数

2)、类别样本(HKCategoryType)

调用方法:

[HKObjectType categoryTypeForIdentifier:HKCategoryTypeIdentifierSleepAnalysis];

*生殖健康

 1. HKCategoryTypeIdentifierSleepAnalysis 睡眠分析
 2.HKCategoryTypeIdentifierAppleStandHour 站立小时
 3. HKCategoryTypeIdentifierCervicalMucusQuality 宫颈粘液质量
 4. HKCategoryTypeIdentifierOvulationTestResult 排卵测试结果
 5. HKCategoryTypeIdentifierMenstrualFlow 月经
 6. HKCategoryTypeIdentifierIntermenstrualBleeding 点滴出血
 7. HKCategoryTypeIdentifierSexualActivity 性行为
 8.HKCategoryTypeIdentifierMindfulSession 正念分钟数

3)、特征样本(HKCharacteristicType)

调用方法:

[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierBiologicalSex];

*本人信息

  1. HKCharacteristicTypeIdentifierBiologicalSex 性别 
  2. HKCharacteristicTypeIdentifierBloodType 血型 
  3. HKCharacteristicTypeIdentifierDateOfBirth 出生日期
  4. HKCharacteristicTypeIdentifierFitzpatrickSkinType 日光反应型皮肤类型

4)、 Correlation(HKCorrelationType)

调用方法:

[HKObjectType correlationTypeForIdentifier:HKCorrelationTypeIdentifierBloodPressure];

*样本类型不允许share和read(枚举)

//不允许share And read
1.HKCorrelationTypeIdentifierBloodPressure 血压   
2.HKCorrelationTypeIdentifierFood 食物

5)、Document(HKDocumentType)

调用方法:

[HKObjectType documentTypeForIdentifier:HKDocumentTypeIdentifierCDA];
    
 1.HKDocumentTypeIdentifierCDA 健康记录请求

6). Workout(HKWorkoutType)

调用方法:

[HKObjectType workoutType];

7). activitySummaryType(健身记录)获取

调用方法:

[HKObjectType activitySummaryType];

5、使用

访问数据:

HKQuantityType * quantityType  = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];    //设置访问步数
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
NSPredicate *predicate              = [HKQuery predicateForSamplesWithStartDate:nil endDate:nil options:HKQueryOptionStrictStartDate];
NSSortDescriptor *sortDescriptor    = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:YES];
HKSampleQuery *sampleQuery          = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:@[sortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
    if(!error && results) {
        for(HKQuantitySample *samples in results) {
            NSLog(@"stepCount = %@ startDate = %@ endDate=%@" , samples.quantity , samples.startDate,samples.endDate);
        }
    }
}];
[healthStore executeQuery:sampleQuery];

写入数据:

HKUnit *unit = [HKUnit countUnit];
HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKQuantity *quantity    = [HKQuantity quantityWithUnit:unit doubleValue:number];
HKQuantitySample *quantitySample = [HKQuantitySample quantitySampleWithType:quantityType quantity:quantity startDate:startDate endDate:endDate];
HKHealthStore *healthStore = [[HKHealthStore alloc] init];
[healthStore saveObject:quantitySample  withCompletion:^(bool success, NSError *error){
    block(success, error);
}];

具体的做法与封装我已经放入git上,如果有需要可以下载看看,git项目地址:https://github.com/zhangyqyx/HealthKit
最近手机更新了ios12和Xcode10 出现了个奇特的bug ,授权的时候老是闪退,并一直提醒

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSHealthShareUsageDescription must be set in the app's Info.plist in order to request read authorization for the following types: HKQuantityTypeIdentifierStepCount'

试试问题万能解决大法---重启Xcode,依然无果
那用排除法,老代码新问题,找了个ios11的机器跑了代码试了下,果然没问题.
一边自己试验各种办法,一边baidu,google找方法,结果大多都是老的帖子讲添加权限字段在info里就好.
最后,翻到jinrui_w帖子将info.plist中权限描述,改为英语才好使

Health Kit 在IOS上的应用_第3张图片
修改英文

貌似随便写英语也不好使,我试过要包含visit read "health"才好使
目前按此方法已解决,如有更好的办法,请指正

希望大家能提出宝贵的意见,可以给我留言,也可以发邮件到我的邮箱:[email protected]
谢谢大家,如果你有更好的想法或文章请告知,不胜感激。
参考文章:
HealthKit框架参考:http://www.cocoachina.com/ios/20140915/9624.html
HealthKit开发教程Swift版:http://www.cocoachina.com/swift/20150122/10998.html
The HealthKit Framework:https://developer.apple.com/reference/healthkit#//apple_ref/doc/uid/TP40014707

你可能感兴趣的:(Health Kit 在IOS上的应用)