iOS HealthKit 健康应用

iOS HealthKit笔记

iOS HealthKit框架使用

  1. 如何使项目能够使用HealthKit
  2. 获取读取和写入healthKit数据的权限
  3. 读取healthKit的数据
  4. 写入HealthKit数据
  5. 对HealthKit数据进行格式化.

HealthKit 是什么东西.

  • HealthKit框架提供了一个结构,应用可以使用它来分享健康和健身数据
  • 简单的说. HealthKit框架用来与苹果的健康应用做数据交互. 例如可以从HealthKit中读取用户的记步数据. 向苹果的健康应用中写入用户的血糖, 血压, 心跳等数据.

如何使项目能够使用HealthKit

首先你的开发者账号的Bundle identifier需要能够使用healthKit.

iOS HealthKit 健康应用_第1张图片
markdownimage-0.jpg

在Target中设置healthKit开启

iOS HealthKit 健康应用_第2张图片
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 健身时间

转发请注明出处( 行如风).

我的理解有什么错漏之处还请指出谢谢

你可能感兴趣的:(iOS HealthKit 健康应用)