iOS HealthKit笔记
iOS HealthKit框架使用
- 如何使项目能够使用HealthKit
- 获取读取和写入healthKit数据的权限
- 读取healthKit的数据
- 写入HealthKit数据
- 对HealthKit数据进行格式化.
HealthKit 是什么东西.
- HealthKit框架提供了一个结构,应用可以使用它来分享健康和健身数据
- 简单的说. HealthKit框架用来与苹果的健康应用做数据交互. 例如可以从HealthKit中读取用户的记步数据. 向苹果的健康应用中写入用户的血糖, 血压, 心跳等数据.
如何使项目能够使用HealthKit
首先你的开发者账号的Bundle identifier需要能够使用healthKit.
markdownimage-0.jpg在Target中设置healthKit开启
markdownimage-1.jpg获取读取和写入HealthKit数据的权限
这句判断healthStore是否可用,只有iOS8以上的版本才有healthKit
[HKHealthStore isHealthDataAvailable];
获取权限.两个参数分别是写权限和读权限,类型为NSSet
可以一次获取许多种权限例如身高体重血压血糖,执行这句后自动弹出页面,用户自主选择授权.
[self.healthStore requestAuthorizationToShareTypes: readTypes: completion:^(BOOL success, NSError *error)]{
}];
HKQuantityType(查询的数据类型)的创建
HKQuantityTyoeIdentifierBloodGlucose表示血糖,在HealthKit/HKTypeIdentifiers.h文件中存储了全部的healthKit数据类型的定义,使用这些identifier来构造HKQuantityType
HKQuantityType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodGlucose];
读取HealthKit数据
读取使用HKSampleQuery对象进行查询,
参数介绍:
SampleType:使用HKQuantityType进行封装,表示查询的数据的类型, predicate:表示过滤方式,可以传nil, limit:查询返回的数据数量,可以为1, sortDescriptors:排序方式
NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];
返回数据results,result为HKQuantitySample类型
数据包含数值和单位,数据单位的类型是HKUnit类型,这个类包含许多的类型,如长度,质量,体积,压力等等,但是像血糖这种毫克/分升或者毫摩>>尔/升,这种单位没有直接提供,但是有个方法能够通过HKQuantityType获取它的HKUnit
HKSampleQuery *query = [HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:limit sortDescriptors:descriptor resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error){
//对result进行解析
HKQuantitySample *sample = resluts.firstObject;
HKQuantity *quantity = sample.quantity;
}];
[self.healthStore executeQuery:query];
[quantity doubleValueWithUnit:此处构造一个合适的HKUnit];
构造HKUnit
[self.healthStore preferredUnitsForQuantityTypes: completion:^(NSDictionary *preferredUnits, NSError *error){
self.unit = [preferredUnits objectForKey:[HKQuantityType alloc initWithXXXXXXX]];
}];
上面的方法的参数是HKQuantityType
返回的HKUnit可以解析HKQuantity,
获取HKQuantity的数值:
[ doubleValueForUnit:];
使用某个单位获取数值
写入数据(以血糖数据为例)
参数说明:
这句使用类型和数量还有时间封装一个HKQuantitySample,只有HKQuantitySample可以被直接保存到HealthKit中
参数说明 HKQuantityType quantity HKQuantity
HKQuantity的构造使用单位和数值两部分.
HKQuantitySample *sugarSample = [HKQuantitySample quantitySampleWithType: quantity startDate: endDate:];
构造单位
[self.healthStore preferredUnitsForQuantityTypes]
HKQuantity *quantity = [HKQuantity quantityWithUnit:self.unit doubleValue:[self.gugarValueTextField.text doubleValue]];
存储数据(写入数据):
[self.healthStore saveObject:sugarSample withCompletion:^(BOOL success, NSError *error){
if(!success){
abort();
}
}];
数据格式化
首先保存和取出的数据类型都是HKQuantitySample
- HKQuantitySample使用HKQuantity和HKQuantityType构造而成
- HKQuantity使用HKUnit和具体的数值构造而成.
- HKQuantityType使用常量字符串构造例如
HKQuantityTypeIdentifierBloodGlucose - HKUnit使用类方法或者HKQuantityType及[self.healthStore preferredUnitsForQuantityTypes:]方法构造而出.
使用字符串构造HKUnit
注意下面的字符串苹果的文档中并没有提供,180.1558800000541这个数值百度为空,使用这个字符串构造HKUnit不知道算不算使用了私有API(这个字符串是我打印对象打出来的)
这里构造了一个血糖的单位. 毫摩尔/升 毫克/分升
HKUnit *unit = [HKUnit unitFromString:@"mmol<180.1558800000541>/L"];
HKUnit *unit = [HKUnit unitFromString:@"mg/dl"];
直接使用字符串构造出的Unit方便简答,只需要记录不同的单位所对应的字符串,毫摩尔每升这个单位对应的字符串实在是奇葩,百度搜这串数字直接空白.使用HKUnit对取出的数据进行格式化免去了手动单位换算的麻烦,据说毫摩尔每升乘以18就是毫克每分升.
上面多数是以血糖数据举例, 同理可以查询写入记步数据, 心率, 血压, 等等. 配合苹果手表, 电子血糖仪, 血压计, 等外设可以自动监测并写入数据到苹果健康应用中.
附录 HealthKit框架体系.
类名 | 翻译 |
---|---|
NSObject | 基类 |
HKBiologicalSexObject | 枚举类型 性别 |
HKBloodTypeObject | 枚举 血型 |
HKHealthStore | 管理数据 |
HKObject | HealthKit数据的基类 |
HKSample | 样本,代表了有开始时间和结束时间相关的数据. |
HKCategorySample | 状态样本 |
HKCorrelation | 复合数据样本 |
HKQuantitySample | 数据样本 |
HKWorkout | 健身样本 |
HKObjectType | 表示数据的类型如血糖数据?身高数据?血压数据? |
HKCharacteristicType | |
HKSampleType | |
HKCategoryType | |
……. | |
HKQuantity | 某一种数据单位的数量 |
HKQuery | 谓词对象 |
HKAnchoredObjectQuery | 锚查询 |
HKCorrelationQuery | 复合数据查询 |
HKObserverQuery | 观察者查询 |
HKSampleQuery | 样本查询 |
HKSourceQuery | 数据来源查询 |
HKStatisticsCollectionQuery | 统计集合查询 |
HKStatisticsQuery | 统计查询 |
HKSource | 数据来源对象 |
HKStatistics | 统计对象 |
HKStatisticsCollection | 统计集合对象 |
HKUnit | 基本的数据单位 |
HKWorkoutEvent | 健身时间 |
转发请注明出处(简书 行如风).
网友评论
if (stat == HKAuthorizationStatusSharingAuthorized) {
NSLog(@"获取步数权限成功");
}else{
NSLog(@"获取步数权限失败");
}
但是关闭打开后的权限状态是一样的,都是HKAuthorizationStatusSharingDenied这个状态,请问这是为什么呢?