iOS HealthKit 健康应用

作者: 行如风 | 来源:发表于2016-05-19 14:33 被阅读1990次

    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 健身时间

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

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

    相关文章

      网友评论

      • 雨秋爱吃鱼:楼主,这个可以获取走的距离吗
      • love断鸿:脉率 可以获取吗
      • 敲代码的兔子:healthKit在读取步数时, 不管是点击允许还是点击不允许, 都会获取到用户已拒绝, 请问楼主这个该怎么解决?
      • 锋芒不露大宝剑:楼主, 我现在做HealhKit总是需要重新打开健康应用才能抓取到新数据, 这个有解决的办法么
      • i_Rick:楼主我想请问一下怎么拿到基本的那些数据 身高体重之类的 我刚接触HealthKit 对于常量这块不是很熟悉 能不能有段代码demo
      • T_label:你好,可以问下,如果我手动关闭数据来源的选项,这个关闭后要怎么判断是否关闭状态。比如需要给一个提示,告知用户当前权限被限制,这个状态怎么获取。
        T_label:@行如风 一直是这个状态HKAuthorizationStatusNotDetermined 不是上面的状态。
        T_label:@行如风 我是使用了authorizationStatusForType这个方法,像这样:HKAuthorizationStatus stat = [self.healthStore authorizationStatusForType:stepCountType];
        if (stat == HKAuthorizationStatusSharingAuthorized) {
        NSLog(@"获取步数权限成功");
        }else{
        NSLog(@"获取步数权限失败");
        }

        但是关闭打开后的权限状态是一样的,都是HKAuthorizationStatusSharingDenied这个状态,请问这是为什么呢?
        行如风:@魚林 HKHealthStore这个类提供了一个类方法+ (BOOL)isHealthDataAvailable;用它来判断HealthKit是否被用户设置为整体不可读. authorizationStatusForType这个对象方法可以精确的得到某种类型的数据是否被用户设置为不可读.

      本文标题:iOS HealthKit 健康应用

      本文链接:https://www.haomeiwen.com/subject/rzlgrttx.html