我们应用内可能会应用苹果自带的健康来读取一些数据,如:每日的步数、活动能量、游泳距离等等。
首先介绍一下 HealthKit, HealthKit是Apple公司在推出iOS 8 系统时一块推出的关于健康信息的框架。如果iPhone手机系统升级到iOS8之后就会发现多了一个健康-app,这就是Apple提供的一个记录用户健康信息的app,可以用它来分享健康和健身数据。还可以指定数据的来源,比如我们自己创建一个app,在我们的app中使用了HealthKit框架之后只要经过用户的认证,就可以在我们的app之中给健康分享数据或者从健康中获取数据。
HealthKit可以与健身设备一起工作,iPhone手机自身可以监控步数信息,会自动导入步数信息。但是其他信息或者设备需要配套的应该才能获取到数据并导入到HealthKit中并在健康中显示。
HealthKit不能再iPad中使用,而且它也不支持扩展。
其次,我们说一下如何使用 HealthKit。
1、在应用中打开 HealthKit功能
2、在info.plist文件中申请key
读取权限 :
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中权限描述,改为英语才好使
貌似随便写英语也不好使,我试过要包含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