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

版本记录

版本号 时间
V1.0 2018.02.04

前言

HealthKit与其他应用程序共享健康和健身数据,同时保持用户的隐私和对数据的控制。感兴趣的可以看上面几篇。
1. HealthKit框架详细解析(一) —— 基本概览(一)

Units and Quantities - 单位和数量

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

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

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

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

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

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


Threading - 线程

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

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

有关多线程和并发编程的更多信息,请参见Concurrency Programming Guide。


Adding Digital Signatures - 添加数字签名

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

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

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

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

// Listing 3

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

这里SignerInfo Type

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

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

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


Benefits of Adopting HealthKit - 使用HealthKit的好处

健康和健身应用程序从采用HealthKit中获得了几个具体的好处。具体来说,HealthKit:

  • Separates data collection, data processing, and socialization,分离数据收集,数据处理和社会化。创造现代健康和健身体验包括许多不同的方面,例如收集和分析数据,向用户提供可操作的信息和有用的可视化,以及培养社区。 HealthKit允许您专注于仅实现您最感兴趣的方面,而将其他任务留给更专用的应用程序。

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

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

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

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

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

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


Topics

1. Classes

  • HKActivitySummary

    • HKActivitySummary对象包含给定日期的用户活动摘要。
  • HKActivitySummaryQuery

    • 活动摘要查询使您可以从HealthKit store中读取HKActivitySummary对象。
  • HKActivitySummaryType

    • HKActivitySummaryType类是HKObjectType类的具体子类。 请求读取HealthKit store中的HKActivitySummary对象的权限时使用活动摘要类型对象。 要创建活动摘要类型,请使用activitySummaryType便利方法。
  • HKAnchoredObjectQuery

    • 锚定对象查询提供了一种在HealthKit store中搜索新数据的简单方法。 HKAnchoredObjectQuery对象返回与该查询接收到的最后一个样本或已删除对象相对应的定位值。 随后的查询可以使用此锚来将其结果限制为仅在锚的样本之后保存或删除的样本。
  • HKBiologicalSexObject

    • 这个类作为HKBiologicalSex枚举的封装。
  • HKBloodTypeObject

    • 该类充当HKBloodType枚举的包装。
  • HKCategorySample

    • HKCategorySample类是HKSample类的具体子类。 这个类描述了从枚举值中选择值的样本。
  • HKCategoryType

    • HKCategoryType类是HKObjectType类的具体子类。 HealthKit使用类别类型来表示可以分类为值的枚举的数据。 使用类别类型实例创建类别样本,然后可以保存在HealthKit store中。 有关更多信息,请参阅HKCategorySample。
  • HKCDADocument

    • HKCDADocument对象表示Clinical Document Architecture (CDA)文档。
  • HKCDADocumentSample

    • HKCDADocumentSample类是HKDocumentSample类的具体子类。
  • HKCharacteristicType

    • HKCharacteristicType类是HKObjectType类的具体子类。 HealthKit使用特征类型来表示通常不会随时间变化的数据。 与其他对象类型不同,特征类型不能用于创建新的HealthKit对象。 相反,用户必须使用健康应用程序输入和编辑他们的特征数据。 只有在要求从HealthKit store中读取数据的权限时才使用特征类型。
  • HKCorrelation

    • HKCorrelation类是HKSample类的一个具体子类。 使用关联对象将多个样本分组到单个数据条目中。 HealthKit使用相关性来表示血压和食物。 血压相关性总是包括代表收缩压和舒张压值的两个数量样本。 相反,食物相关性可以包含关于食物的各种饮食信息,包括关于脂肪,蛋白质,碳水化合物,能量和消耗的维生素的信息。
  • HKCorrelationQuery

    • HealthKit使用相关性查询来搜索HealthKit商店中的相关性。 相关性是将多个数量或类别样本分组在一起的容器。 使用关联查询为 HKCorrelation对象执行复杂的搜索。
  • HKCorrelationType

    • HKCorrelationType类是 HKObjectType类的具体子类。 HealthKit使用关联类型来创建关联对象,将多个样本分组到一个数据条目中。 iOS 8.0支持使用相关类型来表示食物和血压。
  • HKDeletedObject

    • HKDeletedObject类用于表示已从HealthKit store中删除的示例。
  • HKDevice

    • HKDevice实例表示为HealthKit生成数据的设备。 这些设备包括Apple Watch,iPhone以及生成存储在HealthKit中的样本数据的任何其他健康或健身外围设备。 设备对象是不可变的:当你创建HKDevice对象时,你可以设置设备的属性,它们不能改变。
  • HKDocumentQuery

    • HKDocumentQuery类是HKQuery类的具体子类,它提供了从HealthKit store中检索文档的接口。
  • HKDocumentSample

    • HKDocumentSample类是一个抽象类,它表示HealthKit商店中的健康文档。
  • HKDocumentType

    • HKDocumentType类是HKSampleType类的具体子类。 创建文档查询时使用文档类型对象。
  • HKFitzpatrickSkinTypeObject

    • HKFitzpatrickSkinTypeObject类充当代表用户皮肤类型的值的包装,基于Fitzpatrick尺度。 此包装允许您在HealthKit store中读取和写入皮肤类型值。
  • HKHealthStore

    • HealthKit商店充当您与HealthKit管理的所有数据的链接。 使用HKHealthStore对象来请求共享或读取HealthKit数据的权限。 一旦授予权限,您可以使用HealthKit store将新样本保存到商店,或者管理您的应用程序保存的样本。 另外,您可以使用HealthKit store来启动,停止和管理查询。
  • HKObject

    • 可存储在HealthKit store内的一段数据。
  • HKObjectType

    • HealthKit使用HKObjectType实例存储关于保存在HealthKit store中的数据的类型信息。
  • HKObserverQuery

    • 观察者查询在后台队列上设置一个长时间运行的任务。 此任务监视HealthKit存储,并在每次将匹配数据保存到商店或从商店中删除时提醒您。 观察者查询可让您的应用程序响应其他应用程序和设备所做的更改。
  • HKQuantity

    • HealthKit使用数量对象来存储数字数据。 数量存储给定单位的值。 您可以请求任何兼容单位的价值。 例如,如果您可以以英尺为单位创建长度属性,则可以请求以米为单位的值。 数量对象根据需要自动将其值转换为请求的单位。
  • HKQuantitySample

    • HKQuantitySample类是HKSample类的具体子类。 每个数量样本实例代表一个具有单个数值的数据。 例如,您可以使用数量样本来记录用户的身高,用户的当前心率,或汉堡包中卡路里的数量。 HealthKit提供了广泛的数量类型,让您跟踪许多不同的健康和健身功能。
  • HKQuantityType

    • HKQuantityType类是HKObjectType类的具体子类。 HealthKit使用数量类型创建存储数值的样本。 使用数量类型实例创建您可以保存在store HealthKits中的数量样本。 有关更多信息,请参阅HKQuantitySample。
  • HKQuery

    • HKQuery类是从HealthKit store中检索数据的所有查询对象的基础。 HKQuery类是一个抽象类。 你不应该直接实例化一个HKQuery对象。 相反,您总是使用其中一个具体的子类:HKAnchoredObjectQuery,HKCorrelationQuery,HKObserverQuery,HKSampleQuery,HKSourceQuery,HKStatisticsQuery,或 HKStatisticsCollectionQuery对象。
  • HKQueryAnchor

    • HKQueryAnchor对象对应于前一个锚定对象查询返回的最后一个样本。 自上次查询以后,使用此锚来查询添加到商店或从商店中删除的样本。
  • HKSample

    • HealthKit示例代表与开始和结束时间相关的一段数据。 如果样本在一段时间内表示数据,则开始时间必须早于结束时间。 如果样本代表特定时刻的数据,则开始和结束时间可以相同。
  • HKSampleQuery

    • HealthKit使用示例查询来搜索HealthKit store中的示例数据。 您可以使用示例查询来搜索HKSample类的任何具体子类,包括HKCategorySample,HKCorrelation,HKQuantitySample和HKWorkout对象。
  • HKSampleType

    • HKSampleType类是HKObjectType类的抽象子类,用于表示数据样本。 切勿直接实例化HKSampleType对象。 相反,您应该始终使用其中一个具体的子类:HKCategoryType,HKCorrelationType,HKQuantityType或HKWorkoutType类。
  • HKSource

    • 源对象表示HealthKit中的不同数据源。 这些来源可能包括应用程序和设备,其数据可以直接导入到HealthKit store中。 目前,HealthKit仅支持从蓝牙LE设备直接导入心率数据。 所有其他设备需要一个伴侣应用程序来收集数据并将其保存到HealthKit。
  • HKSourceQuery

    • 源查询使您可以搜索已将数据保存到HealthKit store的源(应用程序和设备)。 这些查询返回一个集合,其中包含与查询匹配的所有样本的所有来源。
  • HKSourceRevision

    • HKSourceRevision对象表示将对象保存到HealthKit store中的应用程序和应用程序的版本。 这个类作为HKSource类的包装,向版本源添加版本信息。
  • HKStatistics

    • 统计对象表示计算HealthKit商店中一组样本的最小值,最大值,平均值或总和的结果。 HealthKit使用统计查询或统计收集查询创建统计对象。 对于统计查询,它将对与查询匹配的所有样本执行指定的计算。 对于统计收集查询,它将匹配样本分成一组时间间隔,并分别在每个间隔上进行计算。
  • HKStatisticsCollection

    • 顾名思义,一个HKStatisticsCollection对象管理着一系列的统计信息。 每个统计对象表示在单独的时间间隔内计算的数据。
  • HKStatisticsCollectionQuery

    • 统计信息收集查询使您可以在一系列固定长度的时间间隔内执行多个统计信息查询。 例如,您可以创建一个统计信息收集查询来计算每天的总步数或每小时的平均心率。 统计信息收集查询通常用于生成图表和图表的数据。 与观察者查询类似,收集查询也可以在向HealthKit商店添加或从中删除匹配样本时接收更新。
  • HKStatisticsQuery

    • 统计查询对一组匹配的数量样本进行统计计算。 统计查询可以计算离散量的最小值,最大值和平均值。 他们也可以计算累计数量的总和。 有关可用数量类型的更多信息并了解它们是离散值还是累积值,请参阅HealthKit Constants中的类型标识符常量。
  • HKUnit

    • 使用HKUnit类来管理HealthKit中的度量单位。
  • HKWheelchairUseObject

    • HKWheelchairUseObject类作为HKWheelchairUse枚举的封装。
  • HKWorkout

    • HKWorkout类是HKSample类的具体子类。 锻炼对象在HealthKit store中记录有关单个身体活动的信息。 HealthKit支持广泛的活动类型。 锻炼对象不仅存储关于活动的总结信息(例如,持续时间,总距离和总燃烧能量),还可以作为其他HKSample对象的容器。 您可以将任意数量的样本与锻炼相关联,让您随着时间的推移跟踪锻炼的变化。 例如,您可能需要将一次运行分解成多个时间间隔,然后添加样本以跟踪用户的心率,燃烧的能量,行进的距离以及每个时间间隔所采取的步骤。
  • HKWorkoutConfiguration

    • HKWorkoutConfiguration类包含有关锻炼会话的配置信息。
  • HKWorkoutEvent

    • 您可以使用锻炼事件在锻炼状态和非活动状态之间切换锻炼对象。 锻炼开始处于活动状态。 暂停事件将其切换到非活动状态;恢复事件将其切换回激活状态。 在锻炼已经不活动时添加暂停事件,或者当锻炼已经处于活动状态时添加恢复事件不会影响锻炼的状态。 这些事件被忽略。
  • HKWorkoutSession

    • 使用HKWorkoutSession对象来跟踪用户在Apple Watch上的锻炼。
  • HKWorkoutType

    • HKWorkoutType类是HKObjectType类的具体子类。 在为锻炼对象创建查询时使用锻炼类型对象。 要创建锻炼类型实例,请使用 workoutType便利方法。
  • HKSeriesBuilder

  • HKSeriesSample

  • HKSeriesType

  • HKWorkoutRoute

  • HKWorkoutRouteBuilder

  • HKWorkoutRouteQuery

2. Protocols

  • HKWorkoutSessionDelegate

3. Reference

  • HealthKit Constants

  • HealthKit Enumerations

  • HealthKit Data Types

后记

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

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