iOS HealthKit 健康应用

iOS HealthKit笔记

iOS HealthKit框架使用

  1. 如何使项目能够使用HealthKit
  2. 获取读取和写入healthKit数据的权限
  3. 读取healthKit的数据
  4. 写入HealthKit数据
  5. 对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 健身时间

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容