天天看点

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

简介

用户数据安全及隐私

HeathKit框架

HeathKit使用

总结

<code>HeathKit</code>是Apple公司在推出iOS 8 系统时一块推出的关于健康信息的框架。如果iPhone手机系统升级到iOS8之后就会发现多了一个<code>健康-app</code>,这就是Apple提供的一个记录用户健康信息的app,可以用它来分享健康和健身数据。还可以指定数据的来源,比如我们自己创建一个app,在我们的app中使用了<code>HeathKit</code>框架之后只要经过用户的认证,就可以在我们的app之中给<code>健康</code>分享数据或者从<code>健康</code>中获取数据。

<code>HeathKit</code>可以与健身设备一起工作,iPhone手机自身可以监控步数信息,会自动导入步数信息。但是其他信息或者设备需要配套的应该才能获取到数据并导入到<code>HeathKit</code>中并在<code>健康</code>中显示。

<code>HeathKit</code>不能再iPad中使用,而且它也不支持扩展。

由于用户的健康信息可能是敏感的,所以这些用户信息不能让开发者很随便的获取到。每条信息的读写都需要用户去选择是否同意,比如用户可以同意你获取到用户的身高体重,但是不同意读写生殖健康等其他用户不愿意公开的信息。为了防止信息泄露,我们是不知道用户是否禁止了某条信息是否被用户禁止读取的。简单的说,如果获取不到某条信息,就代表没有这条信息。

<code>HeathKit</code>在各个应用之间提供了一种有意义的方式共享数据。因此,我们必须使用<code>HeathKit</code>框架提供的数据类型和单位。这保证了数据存在的真正意义,我们不能自定义数据类型及单位。框架使用了子类化,例如<code>HKObject</code>和<code>HKObjectType</code>抽象类拥有很多有平行关系的子类,当使用<code>Object</code>或者<code>ObjectType</code>的时候,必须确保使用正确的子类。

在<code>HeathKit</code>中能够存储的类都是<code>HKObject</code>的子类,大部分<code>HKObject</code>的子类都是不可变的。每个对象都有下面的属性:

UUID:每个对象的标识符

Source:数据的来源,来源可以是<code>HeathKit</code>的健康app,也可以是我们自己创建的app。当一个对象存储到<code>HeathKit</code>中时会设置其来源。只有从<code>HeathKit</code>中获取到的数据的来源才有效。

Metadata:一个包含该对象额外信息的字典,元数据包含预定义的key和自定义的key,预定义的key用来帮助我们在应用间共享数据,而自定义的key用来扩展HeathKit,为对象添加针对应用的数据。

<code>HeathKit</code>的对象主要分为特征和样本。特征对象代表用户的基本不变的数据,包括用户的生日、血型和性别等。我们创建的app不能修改这些信息,只能让用户在<code>健康</code>中去修改或者添加个人特征信息。

样本对象代表某个特定时间的数据,所有的样本类型的对象都是<code>HKSample</code>的子类。它们都有下面的特性:

Type :样本类型,例如:睡眠分享、步行距离、心率样本等

StartDate:样本开始时间

EndDate:样本结束时间。如果是某一个时间的样本,则开始于结束时间相同,如果是某个时间段的样本,则结束时间在开始时间的后面。

样本类型又可以分为四个类型:

类别样本(<code>HKCategorySample</code>):在iOS 8 中,只有睡眠分析这一个类别样本。代表有限种类的样本.

数量样本(<code>HKQuantitySample</code>):这种样本代表存储数据的样本,比如步数、距离、用户的体温等。它是<code>HeathKit</code>中最常见的数据类型。

关系样本(<code>HKCorrelation</code>):代表复合数据,包括一个或者多个样本。在iOS 8 中,用<code>correlation</code>代表食物和血压。在创建食物或血压时,需要用<code>correlation</code>。

训练活动(<code>HKWorkout</code>):代表某种活动,比如走、跑步等。包含有开始时间、结束时间、运动类型、消耗能量、运动距离等属性。还可以为<code>workout</code>关联许多详细的样本。不像<code>correlation</code>,这些样本不包含在<code>workout</code>中,但是可以通过<code>workout</code>获取到。

再介绍一个HeathKit中经常用到的一些类。

每个<code>HkSample</code>的子类都有对应的便利方法创建对应的对象。比如:

对于数量样本,需要创建<code>HKQuantity</code>类的实例。而且数量的单位和类型标识符文档中描述的可用单位要相同。例如:<code>HKQuantityTypeIdentifierHeight</code> 文档中说明它使用长度单位,因此,你的数量必须使用厘米、米、英尺、英寸或者其他长度单位。

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

对应类别样本,需要创建<code>HKCategorySample</code>的实例。它的值必须和类型标识符文档中描述的枚举值相关。例如, <code>HKCategoryTypeIdentifierSleepAnalysi</code>s 文档中说明它使用的枚举值。因此你在创建样本时必须从这个枚举中传递一个值。

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

同样,你必须先创建correlation包含的所有样本。correlation的类型标识符描述了它可以包含的类型和对象的数量。不要把被包含的对象存进HealthKit。它们是以correlation的一部分存储的。

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

对于训练活动样本,首先,创建 <code>HKWorkoutType</code> 实例并不需要指定类型标识符。所有的workout都是用同样的类型标识符。第二,对于每个<code>workout</code>你都需要提供一个 <code>HKWorkoutActivityType</code> 值。这个值定义了<code>workout</code>中执行的活动的类型。最后,当<code>workout</code>保存到<code>HealthKit</code>后,你可以给<code>workout</code>关联额外的样本。这些样本提供了<code>workout</code>的详细信息。

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

HeathKit提供了许多查询读取数据的方法:

这个类代表要查询的数据的单位的类,比如体重的单位,可以为kg、lbs等。这个类为不同的数据类型提供了不同的单位方法。一般在创建前面介绍的样本类型的时候,都需要这个类为样本添加对应的单位。而且提供了一些数学运算,比如千米、米、厘米等之间的转换。

在某些场合,你可以使用格式化器来本地化数量。iOS8提供了提供了新的格式化器来处理长度(<code>NSLengthFormatter</code>)、质量(<code>NSMassFormatter</code>)和能量(<code>NSEnergyFormatter</code>)。对于其他的数量,你需要自己来换算单位和本地化数据。

HeathKit的核心就是它,它代表HeathKit的数据库,使用它就可以从数据库中读取数据。比较重要的方法:

isHealthDataAvailable:判断当前设置是否支持HeathKit

requestAuthorizationToShareTypes(typesToShare: Set?, readTypes typesToRead: Set?, completion: (Bool, NSError?) -&gt; Void): 向用户请求同意读写某些数据

saveObject(object: HKObject, withCompletion completion: (Bool, NSError?) -&gt; Void) :向数据库中添加数据

executeQuery(query: HKQuery) :执行查询,即上面介绍的几种查询方法。

在使用<code>HealthKit</code>之前,必须要执行下列步骤:

打开<code>HeathKit</code>,在Target栏中,打开<code>Capabilities</code>菜单,将<code>HealthKit</code>这一项的开关设为ON的状态。

创建<code>HeathManager.Swift</code> 文件,并导入

<code>HeathKit</code>的核心是<code>HeathStore</code>,创建

然后调用在这个方法中调用<code>isHealthDataAvailable</code>判断当前设备是否支持<code>HeathKit</code>

,最后在上面的方法中,设置要读写的数据类型。

为你的应用实例化一个 HKHealthStore 对象。每个应用只需要一个HealthKit存储实例。这个存储实例就是你和HealthKit数据库交互的主要接口。

使用 <code>requestAuthorizationToShareTypes:readTypes:completion:</code>来认证请求从HeathKit获取数据的权限。

如果当前设备支持HeathKit的时候,这样就会弹出一个请求界面,让用户选择是否同意你能够获取到你要请求的数据。

我们首先创建了<code>ProfileViewController.swift</code>,并用IB创建一个请求个人信息的界面

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

然后在<code>HeathManager.Swift</code> 文件中添加请求个人信息的方法。

对于请求特征信息,前提上用户通过<code>健康</code>添加了出生日期、性别、血型等特征信息

请求体重、身高、BMI的时候,创建另外的方法。

获取之后在之前创建的<code>ProfileViewController.swift</code>文件中获取这些信息,并更新UI。

对应特征信息,可以直接调用查询方法,并更新<code></code>

<code></code>

这里面创建了两个工具方法<code>biologicSexLiteral</code>和<code>bloodTypeLiteral</code>来修改查询的结果为我们想要的样子并显示在界面上。

对于体重和身高,需要创建样本查询<code></code>

对应BMI,它代表人的身体质量指数,它的计算方式是:体重/(身高*身高)。因此它可以这样获得

在下面的方法中添加一个<code>alertView</code>让用户输入BMI值,然后点击确认按钮之后添加到<code>HeathStore</code>中<code></code>

如果添加成功,你就可以去手机上的<code>健康</code>查找BMI,就可以看到我们刚才添加的BMI值,而且它的来源是我们创建的app。

创建一个<code>WorkOutsViewController.swift</code>文件,并在SB中拖对应的IB文件,界面如下

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

然后在在<code>HeathManager.Swift</code> 文件中添加请求workout的方法

然后在<code>WorkOutsViewController.swift</code>文件的<code>viewWillAppear()</code>方法中请求<code>workout</code><code></code>

最后在tableView显示如下

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

在上面的界面的<code>NavgationBar</code>的<code>rightBarItem</code>向下再拖一个控制器,并添加对应的文件<code>AddWorkoutsViewController.swift</code>,并在IB中设置界面信息如下

iOS中 HeathKit框架学习 步数统计等 韩俊强的博客

然后在 <code>AddWorkoutsViewController.swift</code> 复写 <code>tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)</code>,针对点击不同的cell,执行不同的方法。即让用户输入点击的cell对应的输入方式,比如时间就是时间选择器。距离就是一个警示框加一个文本框等。<code></code>

这里面对应的选择的方法就不一一介绍了,就是几个普通的view的添加。添加完所有的信息之后就可以点击<code>done</code> 保存信息,方法如下:<code></code>

如果上面都执行成功,<code>AddWorkoutsViewController.swift</code>就会模态消失,然后在上面的一个页面<code>`WorkOutsViewController.swift</code>就会在tableView的最上层显示出我们刚才添加成功的<code>HKWorkout</code>

HeathKit不只是上面的这些内容,但是能把上面的这些问题搞定,我觉得针对HeathKit的体系会有一个清楚的认识,学习HeathKit更深层次的内容会有很大的帮助。

本文参考文章:

<a target="_blank" href="http://www.cocoachina.com/ios/20140915/9624.html">HealthKit框架参考</a>

<a target="_blank" href="http://www.cocoachina.com/swift/20150122/10998.html">HealthKit开发教程Swift版</a>

<a target="_blank" href="https://developer.apple.com/library/prerelease/ios/documentation/HealthKit/Reference/HealthKit_Framework/index.html#//apple_ref/doc/uid/TP40014707">The HealthKit Framework</a>