HealthKit框架是去年在WWDC 2014上引入的,它是应用程序可以存储,共享和读取与健康相关的数据的单个位置。 新的Health应用程序是用户查看该数据的视图,是iOS 8的旗舰功能之一。
HealthKit的主要优点之一是健身和健康相关的应用程序可以轻松地彼此共享数据。 在过去的一年中,许多开发人员在他们的应用程序中采用了HealthKit,并且精通技术的用户已经期望任何健身应用程序都可以与HealthKit集成。
使用这个新的令人兴奋的框架有很多好处,陷阱和最佳实践。 最近,当我向其中一个应用程序Routie添加对HealthKit的支持时,我具有使用HealthKit框架的第一手经验。 如果您正在考虑在自己的应用程序中使用HealthKit,那么本教程非常适合您。
为什么我应该关心HealthKit?
我已经提到了HealthKit的一些好处,但是如果您还没有出售它,那么让我说,集成HealthKit真的并不难。 我什至更进一步地说,它比Apple引入的其他大多数新框架都容易。 显然,这很大程度上取决于您要实现的目标。 但是总的来说,我想说,整合HealthKit所花费的精力与为用户带来的好处之间的比例是非常有利的。
除了直接集成到现有应用程序之外,它还带来了构建全新类别的应用程序的可能性。 例如,您可以从HealthKit中提取各种数据(例如用户的锻炼或血压),并以一种有趣的方式显示它们,而将收集数据的辛苦工作留给其他应用程序。
你会学什么?
本教程的目的是通过构建示例应用程序来教您基础知识。 此外,我将为您提供许多有用的提示和技巧,说明如何或应该将HealthKit集成到您自己的应用程序中。 阅读本文之后,您应该对HealthKit有基本的了解,可以在应用程序中使用它了。
你应该知道什么
以下列表包括您应该了解的有关HealthKit的一些基本事实:
- HealthKit框架自iOS 8起可用。请注意,它仅在iPhone上可用,在iPad上不可用。
- 苹果公司非常重视隐私保护,这就是为什么您必须显式请求对需要访问的每种数据类型进行读取和/或写入HealthKit的访问。 用户可以选择允许某些类型的访问,而拒绝其他类型的访问。
- HealthKit框架大量使用子类化。
- 主要有两种数据类型, 特征和样本 。 用户的出生日期或血型等特征通常不会改变。 样本代表特定时间点的数据。
- 数量样本是最常见的数据类型。 它们包括用户的身高和体重,所采取的步骤,用户的温度,脉搏率等。
- 锻炼属于样本类别,专门用于表示跑步,散步,骑行等。
有关HealthKit框架的更多信息,请访问Apple的HealthKit框架参考 。
开始之前
我知道您现在可能很想开始示例项目,但是在开始之前,您需要了解一些重要的事项。
- 当用户的电话被锁定时,HealthKit存储将被加密。 这意味着当您的应用程序在后台运行时,您将无法读取它。 但是,即使手机被锁定,也可以写入HealthKit。
- 您必须在您的App Store描述和应用程序中解释您的应用程序将如何使用从HealthKit获得的数据。 否则可能会导致您的应用被拒绝。
- App Store审查指南中有一个新章节涵盖了HealthKit。 在决定是否添加对HealthKit的支持之前,您绝对应该通读它。
- 应用程序与HealthKit集成后,您必须为其提供隐私权政策。 Apple甚至建议一些文档指定与健康相关的隐私策略的外观。 隐私政策必须告诉用户您的应用如何处理其数据,这一点很重要。
现在我们已经解决了这个问题,让我们开始学习本教程。
该项目
我们将构建一个与HealthKit集成的简单应用程序,并解释该框架的一些基本概念。 特别是,我们将:
- 从头开始创建一个新项目并启用HealthKit
- 征求用户的许可以访问其与健康相关的数据
- 读取用户的生日
- 将重量样本写入HealthKit
- 向HealthKit编写锻炼
1.设置项目
启动Xcode并选择File > New > Project ...从iOS> Application部分,选择Tabbed Application模板,然后单击Next 。
输入HealthBasics作为项目的产品名称 ,然后单击Next 。 选择您要保存项目的位置,然后单击创建 。
2.启用HealthKit
在左侧的项目浏览器中 ,单击项目,选择HealthBasics目标,然后打开顶部的“ 功能”选项卡。 向下滚动到HealthKit部分,然后启用HealthKit切换右侧的开关。 在后台,Xcode将为您启用HealthKit做必要的工作。
3.创建用户界面
对于此项目,我们将不使用尺寸等级。 由于默认情况下启用大小类,因此我们需要在Xcode中手动禁用它们。 在左侧的项目浏览器中 ,选择Main.storyboard 。 打开右侧的“ 文件检查器 ”,然后取消选中“ 使用大小类 ”复选框。
Xcode将显示一个警告对话框。 通过单击“ 禁用尺寸类别”将其关闭 ,但要保留iPhone的尺寸类别数据,如下所示。
删除First View Controller中的两个标签。 接下来,将一个标签和一个开关从右侧的Object Library拖到First View Controller上。 将标签的文本更改为Health集成 ,并将开关的状态设置为off 。
在First View Controller中再添加两个标签和一个按钮。 将第一个标签的文本更改为User's age :,将第二个标签的文本更改为?? ,然后将它们水平对齐,如下面的屏幕截图所示。 最后,将按钮的标题更改为“ 读取”并将其放置在第二个标签的右侧。 现在,第一个场景应如下所示:
我们还没有完成。 向First View Controller添加一个标签,一个文本字段和一个按钮,使其水平对齐,如下所示。 将标签的文本更改为User's weight : ,并将按钮的标题更改为Write 。
选择您刚刚添加的文本字段,然后在“ 属性”检查器中将其“ 键盘类型 ”更改为“数字和标点符号” 。 而已。 现在,第一个场景应如下所示:
4.创建HealthKit Manager
我们将把与HealthKit相关的代码保存在一个单独的类GSHealthKitManager
。 现在创建该类。
在项目浏览器中 ,右键单击HealthBasics组,然后选择New File ...。 确保从模板列表中选择了Cocoa Touch Class ,然后单击Next 。 将类命名为GSHealthKitManager ,然后单击下一步 。
打开GSHealthKitManager
类的头文件,并将文件内容替换为以下代码。 稍后,我们将从FirstViewController
类中调用这些方法。
#import <UIKit/UIKit.h>
@interface GSHealthKitManager : NSObject
+ (GSHealthKitManager *)sharedManager;
- (void)requestAuthorization;
- (NSDate *)readBirthDate;
- (void)writeWeightSample:(CGFloat)weight;
@end
接下来,运行GSHealthKitManager
类的实现文件,并将其内容替换为以下内容:
#import "GSHealthKitManager.h"
#import <HealthKit/HealthKit.h>
@interface GSHealthKitManager ()
@property (nonatomic, retain) HKHealthStore *healthStore;
@end
@implementation GSHealthKitManager
+ (GSHealthKitManager *)sharedManager {
static dispatch_once_t pred = 0;
static GSHealthKitManager *instance = nil;
dispatch_once(&pred, ^{
instance = [[GSHealthKitManager alloc] init];
instance.healthStore = [[HKHealthStore alloc] init];
});
return instance;
}
- (void)requestAuthorization {
if ([HKHealthStore isHealthDataAvailable] == NO) {
// If our device doesn't support HealthKit -> return.
return;
}
NSArray *readTypes = @[[HKObjectType characteristicTypeForIdentifier:HKCharacteristicTypeIdentifierDateOfBirth]];
NSArray *writeTypes = @[[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass]];
[self.healthStore requestAuthorizationToShareTypes:[NSSet setWithArray:readTypes]
readTypes:[NSSet setWithArray:writeTypes] completion:nil];
}
- (NSDate *)readBirthDate {
NSError *error;
NSDate *dateOfBirth = [self.healthStore dateOfBirthWithError:&error]; // Convenience method of HKHealthStore to get date of birth directly.
if (!dateOfBirth) {
NSLog(@"Either an error occured fetching the user's age information or none has been stored yet. In your app, try to handle this gracefully.");
}
return dateOfBirth;
}
- (void)writeWeightSample:(CGFloat)weight {
// Each quantity consists of a value and a unit.
HKUnit *kilogramUnit = [HKUnit gramUnitWithMetricPrefix:HKMetricPrefixKilo];
HKQuantity *weightQuantity = [HKQuantity quantityWithUnit:kilogramUnit doubleValue:weight];
HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
NSDate *now = [NSDate date];
// For every sample, we need a sample type, quantity and a date.
HKQuantitySample *weightSample = [HKQuantitySample quantitySampleWithType:weightType quantity:weightQuantity startDate:now endDate:now];
[self.healthStore saveObject:weightSample withCompletion:^(BOOL success, NSError *error) {
if (!success) {
NSLog(@"Error while saving weight (%f) to Health Store: %@.", weight, error);
}
}];
}
@end
尽管大多数与HealthKit相关的代码都易于理解,但让我们仔细研究每种方法,以确保我们在同一页面上。
-
sharedManager
是一个类方法,它在第一次调用时创建单例对象,并在每次调用该方法时返回该实例。dispatch_once
函数是一个GCD(大中央调度)函数,该函数可以确保传递给它的块仅被调用一次,即使从多个线程同时调用sharedManager
方法也是如此。 -
requestAuthorization
是一种方法,它要求HealthKit存储获得读取和/或写入我们所需的特定数据的权限。 在使用HKHealthStore
类的任何编写/阅读API之前,需要调用此方法。 万一用户拒绝某些(或全部)权限,HealthKit不会通知您。 用户不想共享某些类型的数据这一事实本身就是信息。 苹果就是在乎隐私。 -
readBirthDate
方法返回用户的生日。 如果出现错误或用户未输入出生日期,则返回nil
。 -
writeWeightSample:
将重量测量值保存到HealthKit。 我已经注释了代码,因此您应该大致了解方法中发生的事情。 一旦有了HKQuantitySample
对象,就可以使用其saveObject:withCompletion:
方法将其保存到HKHealthStore
实例。 此方法适用于每种类型的健康数据,并且在保存锻炼数据时还将在本教程的第二部分中使用该方法。
在此步骤中,您遇到了许多HealthKit类。 您可以在HealthKit Framework Reference中阅读有关每个类的更多信息,但我将为您简要介绍每个类。
-
HKHealthStore
这是您访问HealthKit数据的窗口。 Apple建议在您的应用程序中仅使用此类的一个实例,这样非常适合单例模式。 您可以使用它来询问用户权限,将样本和/或锻炼保存到HealthKit以及查询存储的数据。 这些只是HKHealthStore
类的一部分任务。 -
HKUnit
实例可以表示基本单位(例如米,秒和克),也可以表示通过组合基本单位(例如km / h或g /m³)而创建的复杂单位。 可以从字符串方便地创建复杂单位。 -
HKQuantity
实例存储给定单位(由HKUnit
表示)的值(由double表示)。 您可以使用doubleValueForUnit:
方法将数量的值转换为传入的单位。这种转换的一个示例是创建以米为单位的距离数量并以英尺为单位要求其值。 -
HKQuantityType
HealthKit使用数量类型来创建存储数值的样本。 创建数量类型时,建议使用quantityTypeForIdentifier:
。 数量类型的一些示例是骑车距离,燃烧的能量,台阶和飞行的爬升。 -
HKQuantitySample
的实例表示一个样本,该样本具有数量类型(由HKQuantityType
表示),数量(由HKQuantity
表示)以及开始和结束日期。 如果样本不在一段时间内,则结束日期可以与开始日期相同。
现在,我们可以在应用程序中的任何位置使用GSHealthKitManager
单例以与HealthKit一起使用。
结论
在本教程中,您了解了HealthKit框架的基础。 我向您介绍了该框架,并指出了一些注意事项。 我们还建立了示例应用程序的基础,并实现了GSHealthKitManager
类,该类将用于与HealthKit进行交互。
在本系列的第二部分中,我们将继续构建示例应用程序,并进一步集成HealthKit。 您可以在GitHub上找到本教程的源文件 。
翻译自: https://code.tutsplus.com/tutorials/getting-started-with-healthkit-part-1--cms-24477