HealthKit

2018-01-16  本文已影响0人  夏天的风_song

翻译自HealthKit

Framwork

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

概观

HealthKit存储来自iPhone和Apple Watch上的应用程序的数据。它也直接与一些健康和健身设备。在iOS 8.0中,系统可以自动保存兼容的蓝牙LE心率监视器的数据。如果有的话,系统也可以自动从M7运动协处理器导入活动数据。其他设备和数据源必须具有可以访问数据并将其保存到HealthKit的配套应用程序。
HealthKit将数据保存在称为HealthKit存储的加密数据库中。你可以使用这个类来访问这个数据库。iPhone和Apple Watch都有自己的HealthKit商店。Apple Watch和iPhone之间的健康数据同步; 但是,Apple Watch会定期清除旧数据以节省空间。使用此方法确定Apple Watch上最早的数据。earliestPermittedSampleDate()

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

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

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

保护用户隐私

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

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

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

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

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

注意
了解苹果公司使用HealthKit和用户健康相关数据的要求至关重要。要了解这些要求,请参阅Apple Store Review Review指南中的HealthKit部分,该指南可从Apple的App Review支持页面获得。
有关处理敏感用户数据的其他技术信息,请参阅
iOS应用程序编程指南当您的应用程序进入后台时怎么做

使用HealthKit框架

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

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

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

HealthKit数据

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

对象和样本的属性

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

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

设置HealthKit

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

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

有关更多信息,请参阅添加HealthKit(iOS,WatchKit扩展)

2.通过调用方法isAvailable()来确认用户设备上是否有HealthKit可用,如下所示。
if HKHealthStore.isHealthDataAvailable() {
    // add code to use HealthKit here...
}

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

3.如果HealthKit已启用且可用,请为您的应用程序实例化一个对象,如下所示。HKHealthStore
let healthStore = HKHealthStore()

每个应用程序只需要一个HealthKit存储。创建一次后,保留引用,以便以后使用。

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

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

无论何时您的应用程序请求新的权限,系统都会显示一个窗体,其中显示所有请求的数据类型。用户可以打开和关闭个人阅读和共享权限。要了解如何要求权限时提供出色的用户体验,看到HealthKitiOS的人机界面指南
图1显示了Fit应用程序的权限表。要下载示例代码,请参阅适合:存储和检索HealthKit数据

图1 请求适合的应用程序的权限

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

5.提供自定义消息以显示在应用文件的权限表中。读取和写入HealthKit数据都需要自定义消息。设置密钥以自定义读取数据的消息。设置密钥以自定义写入数据的消息。欲了解更多信息,请参阅iOS的钥匙信息属性列表键参考
6.在尝试保存用户数据之前,请确保您的应用程序有权使用HealthKit方法共享数据。尝试在请求权限之前保存数据失败并出现错误errorinheritAuthorizationNotDetermined。尝试在权限被拒绝时保存数据失败并显示错误errorAuthorizationDenied

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

将样品添加到HealthKit商店

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

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

2.png

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

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

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

5
锻炼的行为与其他样本有所不同:

锻炼样本可以为“活动”应用中的“移动”和“锻炼”环贡献力量。要做出贡献,您必须将一种或多种燃烧卡路里样本与锻炼联系起来。另外:

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

平衡性能和细节

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

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

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

访问HealthKit数据

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

*   **源查询。**使用此查询搜索已将匹配样本保存到HealthKit商店的来源(应用程序和设备)。源查询列出了保存特定样本类型的所有来源。有关更多信息,请参阅。[HKSourceQuery](https://developer.apple.com/documentation/healthkit/hksourcequery)

单位和数量

HKUnit类提供单个单位的表示形式。它支持广泛的公制和英制单位,以及简单和复杂的单位。一个简单的单位表示一个单一的测量,如米,磅或秒。一个复杂的单元,使用数学运算,如每平方英尺(磅/英尺每秒米(m / s)的或磅结合一个或多个简单单元)。

除了创建HealthKit支持的所有简单单元的便捷方法外,HKUnit还提供构建复杂单元所需的数学运算。您也可以使用格式正确的单位字符串直接创建复杂单位。

有关单位的更多信息,请参阅HKUnit

HKQuantity类存储用于给定的单元的值。然后,您可以请求任何兼容单元中的值,让您的应用程序轻松转换单位之间的值。

有关数量的更多信息,请参阅HKQuantity

您可以使用本地化数量,如长度,质量和能量。对于其他数量,您需要执行转换并自己本地化数据。MeasurementFormatter

线程

HealthKit存储是线程安全的,大多数HealthKit对象是不可变的。通常,您可以在多线程环境中安全地使用HealthKit。
注意

所有HealthKit API的完成处理程序都在私有后台队列上执行。您通常希望在更新用户界面或修改应该仅由主线程触及的任何其他资源之前将此数据分派回主队列。

有关多线程和并发编程的更多信息,请参见并发编程指南

添加数字签名

设备可以对他们创建的样本进行数字签名,让其他应用程序验证样本,并验证他们没有被改变。为了促进这一点,HealthKit提供了数字签名元数据密钥,HKMetadataKeyDigitalSignature。使用此键存储样本记录的数字签名副本。签名由设备生成(应该是防篡改的,因为它存储私人签名密钥)。这允许数据消费者使用该设备的已知公钥检查签名,以验证记录数据没有被改变。由于每条记录都是单独签名的,因此每个记录的存储开销大约为1 KB。因此,此元数据签名项目旨在用于采样率不超过每天几次的记录。较高的采样率将需要将签名应用于合并的样本组,这超出了本文档的范围。

通常,在制造时将私钥提供给防篡改测量设备。(任何私钥重置或证书更新的策略或机制都不在本文的范围之内)。相应的公钥将由设备制造商发布,例如,在他们的网页上。对于每个示例,设备都会将示例记录以及签名传递给iOS应用程序,这会将这两个项目都存储在HealthKit数据库中。请注意,私钥 - 公钥对用于数字签名以提供数据完整性,而不用于加密。数据记录中的实际值是明文。

用于数字签名的格式是IETF RFC 5652中规定的加密消息语法(Cryptographic Message Syntax,CMS)。签名使用带有区分编码规则(DER)的ASN.1进行编码。使用的消息摘要应该是SHA256,签名密码应该是FIPS PUB 186-4数字签名标准椭圆曲线P-256。这将确保力量和效率。另外,整个签名应该是base64编码,以便它可以存储在HealthKit NSString元数据对象中。

签名应该是ASN.1签名数据内容类型:

SignedData ::= SEQUENCE {
  version CMSVersion,
  digestAlgorithms DigestAlgorithmIdentifiers,
  encapContentInfo EncasulatedContentInfo,
  signerInfos SignerInfo }

其中SignerInfo类型是:

SignerInfo ::= SEQUENCE {
  version CMSVersion,
  sid SignerIdentifier,
  digestAlgorithm DigestAlgorithmIdentifier,
  signatureAlgorithem SignatureAlgorithmIdentifier,
  signatureSignatureValue }

摘要和签名算法如上所述。可选项目已被省略。SignerIdentifier用于检索用于签名验证的正确公钥。

EncapsulatedContentInfo应该是设备生成的样本记录中相关项目的副本。该副本应使用ASN.1 DER进行编码,并应至少包含一个样本时间戳和样本值。记录数据被复制到签名中,以便有一个稳定的,明确定义的二进制编码(ASN.1 DER)的数据,这是产生可验证签名所必需的。对于大多数记录类型来说,ASN.1编码的plist结构(键值对)应该是足够的。(请参阅“使用ASN.1 DER编码plist结构”)。

采用HealthKit的好处

健康和健身应用程序从采用HealthKit中获得了几个具体的好处。具体来说,HealthKit:
分离数据收集,数据处理和社会化。创造现代健康和健身体验包括许多不同的方面,例如收集和分析数据,向用户提供可操作的信息和有用的可视化,以及培养社区。HealthKit允许您专注于仅实现您最感兴趣的方面,而将其他任务留给更专用的应用程序。

这种责任分离使用户可以通过选择自己喜欢的体重跟踪应用程序,步数计数应用程序和健康挑战应用程序,采用混合搭配的方式,每个应用程序都根据自己的需求进行了校准。但是,因为HealthKit应用程序可以自由交换数据(具有用户权限),所以组合套件提供比任何单个应用程序本身更好的体验。

例如,一群朋友可以决定加入每日步数挑战。每个人都可以使用自己喜欢的硬件设备或应用程序来跟踪这些步骤,但他们仍然可以使用相同的社交应用程序来应对挑战。

启用应用程序之间的自动数据共享。对于开发人员,您不再需要下载API并编写自定义代码以与每个应用程序共享。当新的HealthKit应用程序可用时,他们可以通过HealthKit存储自动开始共享。

用户不需要手动设置应用程序之间的连接或导入和导出数据。重要的是,用户仍然可以控制哪些应用程序可以读取和写入HealthKit存储数据以及每个应用程序有权访问哪些数据。但是,只要用户授予权限,应用程序就可以自由和无缝地访问彼此的数据。

提供更丰富的数据和更大的上下文感。通过访问更广泛的数据,每个应用程序都可以更全面地了解用户的健康和健身需求。在许多情况下,应用程序可以根据HealthKit商店的附加信息修改其指标或建议。例如,训练应用程序可以建议不仅基于燃烧的卡路里的数量而且还基于当天到目前为止已经吃过的食物的类型和数量来决定锻炼后的零食。

培育更大的生态系统。通过共享数据,应用程序成为更大的生态系统的一部分,增加了应用程序的可见性和实用性。更重要的是,HealthKit让您的应用程序与用户已经拥有和喜爱的其他应用程序进行协作。如果他们无法与您的应用共享数据,他们可能会决定在其他地方寻找解决方案。

上一篇 下一篇

猜你喜欢

热点阅读