HealthKit框架详细解析(一) —— 基本概览(一)

版本记录

版本号 时间
V1.0 2018.02.03

前言

HealthKit与其他应用程序共享健康和健身数据,同时保持用户的隐私和对数据的控制。

Overview

我们先看一下框架的详细信息。

HealthKit框架详细解析(一) —— 基本概览(一)_第1张图片

HealthKit存储来自iPhone和Apple Watch上的应用程序的数据。它也直接与一些健康和健身设备共同作用。在iOS 8.0中,系统可以自动保存兼容的蓝牙LE心率监视器的数据。如果有的话,系统也可以自动从M7运动协处理器导入活动数据。其他设备和数据源必须具有可以访问数据并将其保存到HealthKit中的配套应用程序。

HealthKit将数据保存在名为HealthKit存储的加密数据库中。您可以使用HKHealthStore类访问这个数据库。 iPhone和Apple Watch都有自己的HealthKit商店。 Apple Watch和iPhone之间的健康数据同步;但是,Apple Watch会定期清除旧数据以节省空间。使用earliestPermittedSampleDate方法来确定Apple Watch上最早的样本的年龄。

HealthKit旨在管理来自各种来源的数据,根据用户的偏好自动合并来自不同来源的数据。应用程序也可以访问每个来源的原始数据,自己合并数据。

HealthKit提供了一个应用程序来帮助管理用户的健康数据。 Health应用程序充当HealthKit数据的用户界面。用户可以查看,添加,删除,并以其他方式管理他们的健康和健身数据使用这个应用程序。他们还可以编辑每种数据类型的共享权限。

HealthKit和Health应用程序在iPad上不可用。

下面看一下该框架的详细结构。

HealthKit框架详细解析(一) —— 基本概览(一)_第2张图片
HealthKit框架详细解析(一) —— 基本概览(一)_第3张图片
HealthKit框架详细解析(一) —— 基本概览(一)_第4张图片

Protecting User Privacy - 保护用户的隐私

由于健康数据可能非常敏感,因此HealthKit通过对应用程序可以共享的信息进行细粒度控制来授予用户对其数据的控制权。 用户必须明确授予每个应用程序读写数据到HealthKit商店的权限。 用户可以为每种类型的数据分别授予或拒绝权限。 例如,用户可以让您的应用程序读取步数数据,但不能读取血糖水平。 为了防止可能的信息泄露,应用程序不知道它是否被拒绝读取数据的权限。 从应用程序的角度来看,如果应用程序被拒绝读取数据的权限,则不存在该类型的数据。

注意:在iOS 10.0或之后链接的iOS应用必须在其Info.plist文件中包含它需要访问的数据类型的使用说明密钥,否则将会崩溃。 要特别访问和更新HealthKit数据,它必须分别包含NSHealthShareUsageDescription和NSHealthUpdateUsageDescription键。

HealthKit数据只保存在用户的设备上。 为了安全起见,HealthKit store在设备被锁定时被加密。 HealthKit商店只能由授权的应用程序访问。 因此,当您的应用程序在后台启动时,您可能无法从商店读取数据;不过,应用程序仍然可以将数据写入商店,即使手机已锁定。 一旦手机解锁,HealthKit会临时缓存数据并将其保存到加密存储中。

另外,除非应用程序主要用于提供健康或健身服务,否则您的应用程序不得访问HealthKit API。 您的应用程序作为健康和健身服务的角色必须在您的营销文本和用户界面中都清楚。 具体而言,以下准则适用于所有HealthKit应用程序:

  • 您的应用程序不得将通过使用HealthKit框架获得的信息用于广告或类似服务。 请注意,您仍然可以在使用HealthKit框架的应用中投放广告,但不能使用HealthKit商店中的数据投放广告。

  • 未经用户明确许可,不得将通过HealthKit获得的任何信息透露给第三方。 即使获得许可,只有在向用户提供健康或健身服务的情况下,才能将信息分享给第三方。

  • 您不能将通过HealthKit获取的信息出售给广告平台,数据经纪人或信息转销商。

  • 如果用户同意,您可以与第三方共享他或她的HealthKit数据以进行医学研究。

  • 您必须向用户清楚地透露您和您的应用程序将如何使用他们的HealthKit数据。

您还必须为使用HealthKit框架的任何应用程序提供隐私政策。 您可以在以下网站找到有关创建隐私政策的指导:

  • 个人健康记录模型(针对非HIPAA应用程序):http://www.healthit.gov/policy-researchers-implementers/personal-health-record-phr-model-privacy-notice

  • HIPAA模式(适用于HIPAA涵盖的应用程序):http://www.hhs.gov/ocr/privacy/hipaa/modelnotices.html

由国家卫生信息技术协调员(ONC)开发的这些模型旨在通过使用简单的语言和平易近人的设计来解释如何收集和共享用户数据,从而改善用户体验和理解。 这些模型并不是要取代基于网络的隐私政策,开发者应该咨询ONC指导哪些模型适合给定的应用程序。 这些模型仅供您参考,Apple明确表示不承担使用此类模型的全部责任。

注意:了解苹果公司使用HealthKit和用户健康相关数据的要求至关重要。 要了解这些要求,请参阅Apple Store Review Review Guidelines 中的HealthKit部分,该指南可从Apple的App Review Support支持页面获得。有关处理敏感用户数据的其他技术信息,请参阅 App Programming Guide for iOS中的What to Do When Your App Enters the Background。


Working with the HealthKit Framework - 使用HealthKit框架

HealthKit框架旨在以有意义的方式在应用程序之间共享数据。该框架将数据和单元的类型限制为预定义列表,确保所有应用程序都了解数据的含义以及如何使用它们。开发人员不能创建自定义数据类型或单位。相反,HealthKit提供了各种各样的数据类型和单位。

此外,框架使用大量的子类,产生类似类的深层次结构。这些类通常在它们之间有细微而重要的差别。例如,HKQuantitySample对象用于存储具有数值的数据,而HKCategorySample对象用于存储从枚举中选择的值。

HealthKit也使用密切相关的类对。这些类必须正确配对。例如,HKObject和 HKObjectType抽象类具有很大一部分具体子类的并行层次结构。当使用对象和对象类型时,必须使用匹配的子类。

HealthKit Data - HealthKit数据

HealthKit在HealthKit Store中保存各种数据类型:

  • 特征数据。

    • 这些记录表示通常不会更改的项目。这些数据包括用户的生日,血型,生物性别和皮肤类型。您可以使用 dateOfBirth(),bloodType(),biologicalSex()和fitzpatrickSkinType()方法直接从HealthKit存储中读取此数据。您的应用程序无法保存特征数据。用户必须使用Health应用程序输入或修改这些数据。
  • 样本数据。

    • 用户的大部分健康数据都存储在样本中。这些样本代表特定时间点的数据。所有样本类都是HKSample类的子类,它是HKObject类的子类。这些类在 Properties of Objects and Samples中有更详细的描述。
  • 源数据。

    • 每个样本存储关于其来源的信息。 HKSourceRevision对象包含有关保存样本的应用程序或设备的信息。 HKDevice对象包含有关生成数据的硬件设备的信息。
  • 删除的对象。

    • HKDeletedObject实例用于临时存储已从HealthKit Store中删除的项目的UUID。当用户或其他应用程序删除对象时,可以使用已删除的对象进行响应。有关更多信息,请参阅 HKAnchoredObjectQuery和HKDeletedObject。

Properties of Objects and Samples - 对象和样本属性

HKObject类是所有HealthKit示例类型的超类。 所有的HKObject子类都是不可变的。 每个对象都有以下属性:

  • UUID。

    • 该特定条目的唯一标识符。
  • Metadata - 元数据。

    • 包含有关条目的其他信息的字典。 元数据可以包含预定义键和自定义键。 预定义键便于在应用程序之间共享数据。 自定义键有助于扩展给定的HealthKit对象类型,将特定于应用程序的数据添加到条目中。
  • Source Revision - 源修订。

    • 样本的来源。 来源可以是直接将数据保存到HealthKit或应用程序的设备。 将对象保存到HealthKit存储时,HealthKit会自动记录每个对象的源和版本。 该属性仅适用于从商店检索的对象。
  • Device - 设备。

    • 生成存储在此示例中的数据的硬件设备。

HKSample类是HKObject的一个子类。 示例对象表示特定时间点的数据。 所有示例对象都是HKSample类的子类。 他们都有以下属性:

  • Type - 类型。

    • 样本类型;例如,睡眠分析样本,身高样本或步数样本。
  • Start date - 开始日期。

    • 样本的开始时间。
  • End date - 结束日期。

    • 样本的结束时间。 如果样本代表单个时间点,则结束时间应等于开始时间。 如果样本代表一段时间内收集的数据,则结束时间应在开始时间之后进行。

样本进一步分为四个具体的子类:

  • Category samples - 类别样本。

    • 可以分类为有限类别的数据。参见HKCategorySample。
  • Quantity samples - 数量样本。

    • 可以存储为数值的数据。数量样本是HealthKit中最常见的数据类型。这些包括用户的身高和体重,以及其他数据,如所采取的步骤数量,用户的温度和脉搏率。参见HKQuantitySample。
  • Correlations - 相关性。

    • 包含一个或多个样本的复合数据。在iOS 8.0中,HealthKit使用相关性来表示食物和血压。创建食物或血压数据时,应始终使用相关性。见HKCorrelation。
  • Workouts - 锻炼。

    • 代表运动的数据,如跑步,游泳,甚至是玩耍。锻炼往往有类型,持续时间,距离和消耗能量属性。您还可以将锻炼与许多细粒度的样本关联起来。与相关性不同,这些样本不包含在锻炼中 - 但是,他们可以使用锻炼进行查询。有关更多信息,请参阅HKWorkout。

Setting Up HealthKit - 设置HealthKit

设置HealthKit:

  1. 在Xcode中,为您的应用程序启用HealthKit功能。

当您在iOS应用程序上启用HealthKit功能时,Xcode会将HealthKit添加到所需设备功能的列表中。 这可以防止用户在不支持HealthKit的设备上购买或安装应用程序。
如果HealthKit对于应用程序的正确操作不是必需的,则可以打开应用程序的Info.plist文件,并从Required device capabilities中删除Healthkit条目。
WatchKit扩展程序不使用healthkit条目。
有关所需设备功能的更多信息,请参阅 Information Property List Key Reference中的UIRequiredDeviceCapabilities键。

更多信息,请参阅Adding HealthKit (iOS, WatchKit Extension)

  1. 通过调用isHealthDataAvailable方法来确认用户设备上的HealthKit是否可用,如下所示。
// Listing 1

if ([HKHealthStore isHealthDataAvailable]) {
    // add code to use HealthKit here...
}

HealthKit在iPad上不可用。 如果HealthKit不可用,则其他HealthKit方法将失败并显示HKErrorHealthDataUnavailable错误。

  1. 如果HealthKit已启用且可用,请为您的应用程序实例化一个HKHealthStore对象,如下所示。
// Listing 2

self.healthStore = [[HKHealthStore alloc] init];

每个应用程序只需要一个HealthKit存储。 这些是存在时间较长的对象。 创建一次商店,并保留供以后使用的参考。

  1. 请求用户授权读取和共享HealthKit数据。

您必须先执行此操作,然后才能与商店执行任何任务。 为了保护用户的隐私,HealthKit需要细致的授权。 您必须申请权限才能读取和共享您的应用使用的每种数据类型。

无论何时您的应用程序请求新的权限,系统都会显示一个窗体,其中显示所有请求的数据类型。 用户可以打开和关闭个人阅读和共享权限。 要了解如何在请求权限时提供良好的用户体验,请iOS Human Interface Guidelines中的HealthKit。

图1显示了Fit应用程序的权限表。 要下载示例代码,请参阅Fit: Store and Retrieve HealthKit Data。

HealthKit框架详细解析(一) —— 基本概览(一)_第5张图片
Figure 1 Requesting permission for the Fit app

注意:用户为您的应用程序设置了权限后,可以随时使用SettingsHealth应用程序来更改它们。 即使用户不允许读取或共享数据,您的应用程序也会出现在Health应用程序的Sources选项卡中。

  1. 提供自定义消息以显示在应用的Info.plist文件的权限表中。 读取和写入HealthKit数据都需要自定义消息。 设置NSHealthShareUsageDescription键以定制读取数据的消息。 设置NSHealthUpdateUsageDescription键以定制写入数据的消息。 有关更多信息,请参阅 Information Property List Key Reference中的iOS Keys。

  2. 在尝试保存用户数据之前,请确保您的应用程序有权使用HealthKit方法共享数据。 尝试在请求权限之前保存数据失败,并显示 HKErrorAuthorizationNotDetermined错误。 尝试在权限被拒绝时保存数据失败,并显示HKErrorAuthorizationDenied错误。

  3. 在用户授予共享数据类型的权限之后,您可以:

  • 创建该类型的新样本并将其保存到HealthKit商店。 有关创建样本的更多信息,请参阅 Adding Samples to the HealthKit Store。

  • 使用HealthKit store查询数据。 有关读取HealthKit数据的更多信息,请参阅Accessing HealthKit Data。

有关如何设置和使用HealthKit的实际示例,请参阅 Fit: Store and Retrieve HealthKit Data。


Adding Samples to the HealthKit Store - 将示例添加到HealthKit商店

您的应用程序可以创建新的样本并将其添加到HealthKit商店。 所有样本类型的一般程序是相似的,尽管每种类型在这个主题上都有自己的变化。

  • 在HealthKit Constants中查找正确的类型标识符。
  • 使用类型标识符实例化匹配 HKObjectType子类的对象。 有关便捷方法的列表,请参阅HKObjectType。
  • 使用对象类型实例化匹配HKSample子类的对象。
  • 使用 saveObject:withCompletion:方法将对象保存到HealthKit存储中。

每个HKSample子类都有自己的实例化对象的简便方法。 这些方法修改上述过程。

HealthKit框架详细解析(一) —— 基本概览(一)_第6张图片

对于数量样品,创建一个HKQuantity类的实例。 数量单位必须与类型标识符文档中描述的允许单位一致。 例如, HKQuantityTypeIdentifierHeight文档指出它使用长度单位。 因此,您的数量必须使用厘米,米,英尺,英寸或其他兼容的单位。 有关更多信息,请参阅HKQuantitySample。

HealthKit框架详细解析(一) —— 基本概览(一)_第7张图片

对于类别样本,样本值必须与类型标识符文档中描述的枚举相对应。 例如,HKCategoryTypeIdentifierSleepAnalysis文档声明它使用HKCategoryValueSleepAnalysis枚举。 因此,创建此示例时,您必须传递此枚举的值。 有关更多信息,请参阅HKCategorySample。

HealthKit框架详细解析(一) —— 基本概览(一)_第8张图片

对于关联,您必须首先创建关联将包含的所有样本对象。 关联的类型标识符描述了可以包含的对象的类型和数量。 不要将包含的对象保存到HealthKit store中。 它们被存储为相关性的一部分。 有关更多信息,请参阅HKCorrelation。

Workouts行为与其他样本有所不同:

  • 您不需要特定的类型标识符来创建HKWorkoutType
    实例。 所有Workouts使用相同的类型标识符。

  • 您必须为每个Workouts提供一个HKWorkoutActivityType值。 该值定义Workouts期间执行的活动的类型。

  • 锻炼保存到HealthKit商店后,您必须将其他样品与锻炼相关联(例如,活动消耗能量或距离样品)。 这些样本提供关于锻炼的细粒度的细节。 有关更多信息,请参阅HKWorkout。

锻炼样本可以为Activity应用中的Move and Exercise贡献力量。要做出贡献,您必须将一种或多种能量消耗样本与锻炼联系起来。另外:

  • 在watchOS中。使用锻炼会话来跟踪用户的活动。会话结束后,创建锻炼对象和关联的活动能量消耗样本。有关更多信息,请参阅HKWorkoutSession。系统根据活动能量消耗样本更新移动环。它根据手表传感器计算的锻炼期间用户实际施加的时间量来更新锻炼环。

  • 在iOS 10或更高版本中。没有额外的工作是必要的。锻炼对象自动对“移动”和“锻炼”环都有贡献。锻炼环增加锻炼的总持续时间,移动环增加相关的活性能量燃烧样本的卡路里数。 HealthKit还会将锻炼重叠的每个挂钟时间增加1小时。

  • 在iOS 9中保存在iPhone上的锻炼对象不会影响活动环。

在设备上创建并保存最适合您的应用程序的锻炼。 这通常是运行用户锻炼逻辑的设备。

Balancing Performance and Details - 平衡性能和细节

将数据保存到HealthKit store时,通常需要选择使用单个样本来表示数据,还是将数据分成多个较小的样本。 从性能角度来看,单一的长样本更好。 但是,多个较小的样本可以让用户更详细地了解数据如何随着时间而变化。 理想情况下,您希望查找足够精细的样本大小,以向用户提供有用的历史数据。

记录锻炼时,可以使用高频数据(每个样本一分钟或更少)来提供强度图表,并分析锻炼过程中用户的表现。 对于不太密集的活动,如每日步数,一小时或更少的样本通常效果最好。 这可以让你生成有意义的日常和小时图。

应用程序应避免保存24小时或更长的样本。


Accessing HealthKit Data - 访问HealthKit数据

从HealthKit商店访问数据有三种主要方式:

  • 直接方法调用。

    • HealthKit商店提供了直接访问特征数据的方法。这些方法只能用于访问特征数据。有关更多信息,请参阅HKHealthStore。
  • 查询。查询返回HealthKit store中数据的当前快照。所有查询都在匿名后台队列上运行。查询完成后,它将在后台队列上执行结果处理程序。 HealthKit提供了不同类型的查询,每个查询都设计为从HealthKit商店返回不同类型的数据。

    • Sample query - 示例查询。这是一个通用的查询。使用示例查询访问任何类型的示例数据。如果要对结果进行排序或限制返回的样本总数,示例查询尤其有用。有关更多信息,请参阅HKSampleQuery。
    • Anchored object query - 锚定对象查询。使用此查询来搜索已添加到商店或从商店中删除的商品。第一次运行锚点查询时,它将返回当前在商店中的所有匹配样本。在后续运行中,它仅返回自上次运行以来已添加或删除的项目。有关更多信息,请参阅HKAnchoredObjectQuery。
    • Statistics query - 统计查询。使用此查询对匹配样本集进行统计计算。您可以使用统计查询来计算集合中的总和,最小值,最大值或平均值。有关更多信息,请参阅HKStatisticsQuery。
    • Statistics collection query - 统计收集查询。使用此查询在一系列固定长度的时间间隔内执行多个统计查询。创建图形时,您经常会使用这些查询。它们提供了一种简单的方法来计算事物,例如每天消耗的卡路里总数或每5分钟间隔所采取的步数。有关更多信息,请参阅HKStatisticsCollectionQuery。
    • Correlation query - 相关查询。使用此查询来执行关联中包含的数据的复杂搜索。这些查询可以包含存储在关联中的每个样本类型的单独谓词。如果您只想匹配关联类型,请改为使用示例查询。有关更多信息,请参阅HKCorrelation。
    • Source query - 源查询。使用此查询搜索已将匹配样本保存到HealthKit商店的来源(应用程序和设备)。源查询列出了保存特定样本类型的所有来源。有关更多信息,请参阅HKSourceQuery。
    • Activity summary query - 活动摘要查询。 使用此查询来搜索用户的活动摘要信息。 每个活动摘要对象都包含给定日期的用户活动摘要。 您可以查询一天或几天的范围。 有关更多信息,请参阅HKActivitySummaryQuery
    • Document query - 文档查询。 使用此查询来搜索健康文档。 有关更多信息,请参阅[HKDocumentQuery`(apple-reference-documentation://hc2k1_9fDd)。
  • Long running queries - 长时间运行的查询。这些查询继续运行匿名后台队列,并在HealthKit store更改时更新您的应用程序。另外,观察者查询可以注册后台交付。这使得HealthKit每当更新发生时都会在后台唤醒您的应用程序。

    • Observer query - 观察者查询。这个长时间运行的查询会监视HealthKit store并提醒您对匹配样本进行的任何更改。当您想要收到有关商店更改的通知时,请使用观察者查询。您可以注册观察者查询以进行后台交付。有关更多信息,请参阅 HKObserverQuery。
    • Anchored object query - 锚定对象查询。除了返回修改后数据的当前快照之外,锚定对象查询还可以充当长时间运行的查询。如果启用,它将继续在后台运行,随着匹配样本被添加到商店或从商店中删除,提供更新。与观察者查询不同,这些更新包括已添加或删除的项目列表;但是,锚定对象查询不能注册后台处理。有关更多信息,请参阅HKAnchoredObjectQuery。
    • Statistics collection query - 统计收集查询。 除了计算统计集合的当前快照外,此查询还可以充当长时间运行的查询。 如果将匹配样本添加到商店或从商店中删除,则此查询会重新计算统计信息收集,并更新您的应用。 统计信息收集查询不能注册后台交付。 有关更多信息,请参阅 HKStatisticsCollectionQuery。
    • Activity summary query - 活动摘要查询。 除了计算用户活动摘要的当前快照之外,此查询还可以充当长时间运行的查询。 如果用户的活动摘要数据发生更改,则此查询将重新计算活动摘要,并更新您的应用程序。 活动摘要查询无法注册后台处理。 有关更多信息,请参阅HKActivitySummaryQuery。

后记

本篇已结束,后面更精彩~~~

HealthKit框架详细解析(一) —— 基本概览(一)_第9张图片

你可能感兴趣的:(HealthKit框架详细解析(一) —— 基本概览(一))