HealthKit的简单实用

HealthKit为iPhone和Apple Watch上的健康和健身数据提供了一个中央存储库。在用户许可的情况下,应用程序与HealthKit商店进行通信,以访问和* * *享受这些数据。

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

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

HealthKit保存多种数据类型:

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

HKSample类是HKObject的子类。Sample对象表示特定时间点的数据,所有sample对象都是HKSample类的子类。

HKSample进一步分为四个特定的子类:

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

使用HealthKit之前,您必须执行以下步骤:

在使用HealthKit之前,您必须在应用程序中添加HealthKit功能。在Xcode中,选择项目,打开HealthKit功能。

调用isHealthDataAvailable方法以确保HealthKit在用户的设备上可用。

在调用HealthKit的其他方法之前调用此方法。如果设备上(比如iPad上)没有HealthKit,调用其他方法会报错HealthDataUnavailable错误;如果HealthKit受到限制(例如,在企业环境中),调用其他方法将会报告一个errorHealthDataRestricted错误。

如果HealthKit可用并已打开,请实例化HKHealthStore对象:

每个App只需要一个HealthKit Store,是一个长寿命的对象。

为了保护用户隐私,HealthKit需要精细授权。在尝试保存和访问数据之前,您必须申请读取和共享数据的权限。

此外,您需要在info.plist文件中设置两个键:

如果用户同意* * *享受某种类型的数据,你可以创建这种类型的样本,保存在HealthKit Store中。但是,在保存任何数据之前,最好调用authorizationStatusForType:方法来检查您是否拥有该权限。如果您尚未申请此权限,保存数据将引发HKErrorauthorationNotDetermined错误。如果用户拒绝权限申请,尝试保存数据将会引发HKErrorAuthorizationDenied错误。

为了保护用户的隐私,我们的应用程序不会知道用户是否授权或拒绝阅读HealthKit的权利。如果用户拒绝,从HealthKit查询数据时,只会返回我们自己的App成功保存到HealthKit Store的样本数据。

如果应用程序需要访问特定的临床记录数据才能正常运行,请在info.plist文件中添加NSHEALTH REQUIRED READ AuthorizationTypeIdentifiers键,该键定义了应用程序必须具有读取权限的数据类型。

我们的应用程序可以创建新的样本,并将其保存到HealthKit商店。尽管所有样本类型都遵循相似的流程,但每种类型都有自己的变化:

每个HKSample子类都有自己方便的实例化对象的方法。

对于定量样本,创建HKQuantity类的实例。数量单位必须与类型标识符文件中描述的单位一致。例如,HKQuantityTypeIdentifierHeight声明了长度单位,因此数量必须是厘米、米、英尺或英寸或其他兼容单位。可以参考HKQuantitySample。

对于类别样本,样本的值必须对应于类型标识符文档中声明的枚举。例如,hkcategory type identifier sleep analysis指示它使用HKCategoryValueSleepAnalysis枚举。因此,创建此示例时,必须从该枚举中选择一个值。有关更多信息,请参考HKCategorySample

将数据保存到HealthKit存储时,通常需要在使用单个样本表示数据或将数据拆分成几个较小的样本之间做出选择。从性能的角度来看,使用单个样本更好,但多个样本可以让用户更详细地了解他们的数据如何随时间变化。理想情况下,我们可以找到一个合适的样本量,为用户提供有用的历史数据。

在记录运动数据时,可以使用高频数据(每分钟一个样本)来提供强度图标,并以其他方式分析用户在运动中的表现。对于强度较低的活动,如每天的步数,一小时或更短时间的样本通常更好。

App应避免将样本储存24小时或更长时间。

健康应用程序允许用户访问其HealthKit商店中的所有数据。用户可以查看、添加、删除和管理他们的数据。

具体来说,用户可以

所以健康App对HealthKit的发展有一些重要的影响。用户可以在我们的app之外修改数据,甚至可以修改我们app的读写权限。因此,我们的应用程序应该始终查询HealthKit商店中的当前数据。

其次,我们也可以在健康app中查看我们App保存到健康商店的数据。这在早期测试中非常有用。

从HealthKit商店读取数据有三种主要方式。

查询返回HealthKit存储中数据的当前快照。所有查询都在匿名后台队列中运行。当查询完成时,他将在后台队列中处理结果。HealthKit提供不同类型的查询来返回不同类型的数据。

长期运行的查询将在匿名后台队列中持续运行,并在HealthKit商店发生变化时更新我们的应用程序。此外,观察者查询可以注册为后台交付。这样,当有更新发生时,HealthKit就会在后台唤醒我们的app。

HealthKit提供以下长期运行的查询:

HealthKit使用HKObjectType的子类来标识HealthKit中存储的不同类型的数据:

要创建类型对象,需要调用相应的HKObjectType类方法,并传入所需的类型标识符。

您可以使用生成的对象类型请求访问数据的权限,在HealthKit存储中保存新数据或从HealthKit存储中读取数据。

大多数健康和健身数据都使用HKSample的子类保存在HealthKit商店中。所有样本子类在指定时间记录信息。如果sample的startDate和endDate属性相同,则该样本表示一个时间点。如果结束日期在开始日期之后,则样本代表一个时间间隔。

HealthKit使用不同的HKSample子类来存储不同类型的数据: