来自:http://www.cocoachina.com/ios/20140915/9624.html
本文由CocoaChina翻译组成员 唧唧歪歪(微博) 翻译自苹果官方文档:The HealthKit Framework
HealthKit框架提供了一个结构,应用可以使用它来分享健康和健身数据。HealthKit管理从不同来源获得的数据,并根据用户的偏好设置,自动将不同来源的所有数据合并起来。应用还可以获取每个来源的原始数据,然后执行自己的数据合并。
HealthKit也可以直接与健康和健身设备一起工作。在iOS8.0中,系统可以自动将兼容的低功耗蓝牙心率仪的数据直接保存在HealthKit存储中。如果有M7运动协处理器,系统还可以自动导入计步数据。其他的设备和数据源必须要有配套的应用才可以获取数据并保存在HealthKit中。
HealthKit另外提供了一个应用来帮助管理用户的健康数据。健康应用为用户展示HealthKit的数据。用户可以使用健康应用来查看、添加、删除或者管理其全部的健康和健身数据。用户还可以编辑每种数据类型的分享权限。
HealthKit和健康应用在iPad上都不可用。HealthKit框架不能用于应用扩展。
HealthKit和隐私
由于健康数据可能是敏感的,HealthKit通过精确控制哪些信息允许应用读取,从而让用户可以控制这些数据。用户必须明确设置每个应用在HealthKit存储中读写的权限。用户可以单独为每种数据类型设置准许或拒绝的权限。例如,用户可以允许你的应用读取计步数据,但是不允许读取血糖水平。为了防止可能的信息泄露,应用是不知道它是否被禁止读取数据的。从应用的角度来看,如果被禁止读取数据,就是没有那种类型的数据存在。
HealthKit的数据不会保存在iCloud中,也不会在多设备间同步。这些数据只会保存在用户的本地设备中。为了安全考虑,当设备没有解锁时,HealthKit存储的数据是加密的。
另外,你的应用如果主要不是提供健康或健身服务的话,那就不能调用HealthKit的API。如果你的应用提供健康和健身服务,就必须要在销售文本和用户界面上明确的表明。特别是下面几条指导适用于所有HealthKit应用。
1. 你的应用不应该将HealthKit收集的数据用于广告或类似的服务。注意,可能在使用HealthKit框架应用中还是要服务广告,但是你不能使用HealthKit中的数据来服务广告。
2. 在没有用户的明确允许下,你不能向第三方展示任何HealthKit收集的数据。即使用户允许,你也只能向提供健康或健身服务的第三方展示这些数据。
3. 你不能将HealthKit收集的数据出售给广告平台、数据代理人或者信息经销商。
4. 如果用户允许,你可以将HealthKit数据共享给第三方用于医学研究。
5. 你必须明确说明,你和你的应用会怎样使用用户的HealthKit数据。
你必须为每个使用HealthKit框架的应用提供一份隐私策略。你可以在以下网站找到创建隐私策略的指导:
这些模板由ONC开发,通过直白的语言和平易近人的设计来解释用户数据是如何被收集和共享的,从而提高用户的体验和理解。这些不是用来替代基本的互联网隐私策略,而且开发者应该咨询ONC来了解你的应用适用哪种模板。这些模板仅供参考,Apple不承担你使用这些模板带来的后果。
注意:
这一节提供了一些指导来帮助你创建一个HealthKit应用,并尊重用户的隐私。了解Apple对使用HealthKit和用户健康相关数据的要求是很有必要的。参看App Store Review Guidelines中的HealthKit章节来了解更多,可以在Apple的
App Review Support 页面中找到。
从接入HealthKit中获益
健康和健身应用可以从接入HealthKit中获益颇多。下面列出了一些主要的好处。
分离数据收集、数据处理和社交化。现代的健康和健身体验设计许多不同的方面,例如收集和分析数据,为用户提供可操作的信息和有用的可视化信息,以及允许用户参与到社区讨论中。现在由HealthKit负责实现这些方面,而你可以专注于实现你最感兴趣的方面,把其他的任务交给更专业的应用。
这些责任的分离也可以让用户受益。每个用户都可以随意选择最喜爱的体重追踪应用、计步应用和健康挑战应用。这意味着用户可以选择一套应用,每个应用都能很好的满足用户的某个需求。但是由于这些应用可以自由地交换数据,所以这一整套应用比单个应用能提供更好的体验。
例如,一些朋友决定参加一个日常的计步挑战。每个人都可以使用他偏爱的硬件设备或应用来追踪计步数据,但是他们都还可以使用相同的社交应用来挑战。
减少应用间分享的障碍。HealthKit使应用间共享数据变得更容易。对于开发者来说,你不在需要下载API并编写代码来和其他应用共享。当有新的HealthKit应用时,它们就通过HealthKit自动开始共享数据了。
由于不需要手动设置应用关联或者导入导出他们的数据,这对用户来说很好。用户仍然需要设置哪些应用可以读写HealthKit中的数据,还有每个应用可以读取到哪些数据。一旦用户允许访问,应用就可以自由无阻地读取数据了。
提供更丰富的数据和更有意义的内容。应用可以读取到范围更广的数据,从而可以得到一个完整的关于用户健康和健身需求。在许多情况下,应用可以基于HealthKit中的额外信息修改它的计量单位或者提示。例如,训练应用不仅可以根据用户已经消耗的热量,还可以参考他今天已经吃的食物种类和数量,来给出一个训练后吃什么的建议。
让应用参与到一个更大的生态系统中。应用通过共享它使用HealthKit收集的数据来获益。成为这个大生态系统的一部分能帮助提高你的应用的曝光度和实用性。更重要的是,接入HealthKit能让你的应用和用户已经拥有喜爱的应用一起工作。如果你的应用不能和其他已经在使用的应用共享数据,那么用户很可能就去寻找别的应用了。
HealthKit的设计思路
HealthKit是用来在应用间以一种有意义的方式共享数据。为了达到这点,框架限制只能使用预先定义好的数据类型和单位。这些限制保证了其他应用能理解这些数据是什么意思已经怎样使用。因此,开发者不能创建自定义数据类型和单位。而HealthKit尽量会提供一个应该完整的数据类型和单位。
框架还大量使用了子类化,在相似的类间创建层级关系。通常这些类间都有一些细微但是重要的差别。还有不少很相关的类,需要正确地区别开才能一起工作。例如
HKObject
和
HKObjectType
抽象类有很多平行层级的子类。当使用object和object type时,必须确保使用匹配的子类。
HealthKit中所有的对象都是HKObject的子类。大部分
HKObject 对象子类都是不可变的。每个对象都有下列属性:
1. UUID。每个对象的唯一标示符。
2. Source。数据的来源。来源可以是直接把数据存进HealthKit的设备,或者是应用。当一个对象保存进HealthKit中时,HealthKit会自动设置其来源。只有从HealthKit中获取的数据source属性才可用。
3. Metadata。一个包含关于该对象额外信息的字典。元数据包含预定义和自定义的键。预定义的键用来帮助在应用间共享数据。自定义的键用来扩展HealthKit对象类型,为对象添加针对应用的数据。
HealthKit对象主要分为2类:特征和样本。特征对象代表一些基本不变的数据。包括用户的生日、血型和生理性别。你的应用不能保存特征数据。用户必须通过健康应用来输入或者修改这些数据。
样本对象代表某个特定时间的数据。所有的样本对象都是
HKSample的子类。它们都有下列属性:
1. Type。样本类型。例如,这可能包括一个睡眠分析样本、一个身高样本或者一个计步样本。
2. Start date。样本的开始时间。
3. End date。样本的结束时间。如果样本代表时间中的某一刻,结束时间和开始时间相同。如果样本代表一段时间内收集的数据,结束时间应该晚于开始时间。
样本可以细分为四个样本类型。
4. Workout。Workout代表某些物理活动,像跑步、游泳,甚至游戏。Workout通常有类型、时长、距离、和消耗能量这些属性。你还可以为一个workout关联许多详细的样本。不像correlation,这些样本是不包含在workout里的。但是,它们可以通过workout获取到。更多信息,参见
HKWorkout Class Reference。
设置HealthKit
在你开始使用HealthKit之前,必须要执行下列步骤:
1. 在Xcode中打开HealthKit功能。
3. 为你的应用实例化一个
HKHealthStore 对象。每个应用只需要一个HealthKit存储实例。这个存储实例就是你和HealthKit数据库交互的主要接口。
如果用户允许读取某种类型的数据,那么你就可以从HealthKit中读取这些数据。不幸的是,即使知道用户拒绝读取某种类型的数据,也可能会显示出潜在的健康问题。因此,你的应用无法确定用户是否允许读取数据。如果你没有得到读取某种数据的许可,那简单来看就好像是HealthKit中没有这种类型的数据。
向HealthKit 存储中添加样本
你的应用可以创建新的样本,并添加到HealthKit存储中。对所有样本类型来说,大致的过程都是类似的,但是又有一些不同。
每个
HKSample 子类都有自己的便捷方法来实例化样本对象。流程如下图所示。
对于correlation,你必须先创建correlation包含的所有样本。correlation的类型标识符描述了它可以包含的类型和对象的数量。不要把被包含的对象存进HealthKit。它们是以correlation的一部分存储的。更多信息,参见
HKCorrelation Class Reference。
读取HealthKit数据
HealthKit提供了许多方法来读取数据。
4. 锚定对象查询。用这种查询来搜索添加进存储的项。当锚定查询第一次执行时,会返回存储中所有匹配的样本。在接下来的执行中,只会返回上一次执行之后添加的项目。通常,锚定对象查询会和观察者查询一起使用。观察者查询告诉你某些项目发生了变化,而锚定对象查询来决定有哪些(如果有的话)项目被添加进了存储。更多信息,参见
HKAnchoredObjectQuery Class Reference。
单位换算
HealthKit使用
HKUnit 和
HKQuantity 类来支持单位。
HKUnit 提供了单一单位的表示。它支持大部分的公制和英制单位,当然还包括基本单位和符合单位。基本单位代表单一的度量,例如米、磅或者秒。复合单位使用数学运算连接一个或多个基本单位,例如m/s或者lb/ft2。
HKUnit提供了便捷方法来创建HealthKit支持的所有基本单位。它还提供了构建复合单位需要的数学运算。最后,你还可以通过直接使用恰当的格式化的单位字符串来创建复合单位。
HKQuantity 类存储了给定单位的值。之后你可以用任何兼容的单位来取值。这样,你的应用就可以很轻松的完成单位换算。
在某些场合,你可以使用格式化器来本地化数量。iOS8提供了提供了新的格式化器来处理长度(NSLengthFormatter)、质量(NSMassFormatter)和能量(NSEnergyFormatter)。对于其他的数量,你需要自己来换算单位和本地化数据。
多线程
HealthKit存储是线程安全的,大部分HealthKit对象是不可变的。通常来说,你可以在多线程环境中安全地使用HealthKit。
注意:
所有HealthKit API的完成回调都在一个私有的后台队列中执行。所以在你更新用户界面或者修改一些只能在主线程中处理的资源之前,你应该把这些数据传回主线程。
添加数字签名
HealthKit中的数字签名元数据对象提供了由可信设备生成的样本记录的数据完整性。元数据项存储了一份数字签名过的样本记录副本。签名是由设备生成的(由于设备存储了私有签名密钥,所以设备应该是防篡改的)。这样数据的使用者就可以通过设备的公钥来检查签名,进而验证记录数据是否被修改过。由于每条记录都是独立签名的,所以每条记录总共能存储大约1K bytes的签名。因此,这种元数据签名项是给那些样本率最多在每天几次的记录使用的。更高的样本率需要对样本组进行签名,这已经超出了本文档的范围。
通常,私钥是在制造时置入防篡改的测量设备中的。(私钥重置或证书更新的政策或机制不在本文档的范围内)相关的公钥会由设备制造商公布,例如在它们的网站上。设备应该将每个样本的样本数据和签名传给iOS应用,这两者都会储存在HealthKit数据库中。注意,数字签名的公私钥是用来提供数据完整性检查的,不是用来加密的。数据记录中的实际值都是明文。
数字签名的格式是IETF RFC 5652中的CMS(Cryptographic Message Syntax)。签名使用ASN.1的DER(Distinguished Encoding Rules)编码。使用的信息摘要应该是SHA256,签名加密应该是FIPS PUB 186-4 Digital Signature Standard Elliptic Curve P-256。这样长度和效率都有保证。另外,整个签名都应该使用bsae64编码,这样就能存储在HealthKit NSString 元数据对象中。
签名应该是ASN.1 Signed-data Content Type:
- 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结构(键值对),应该能满足大部分记录类型。(参见“使用ASN.1 DER来编码plist结构”)
- HealthKit框架
HealthKit框架相关资料 链接: HealthKit框架参考 HealthKit开发快速入门教程之HealthKit数据的操作 HealthKit开发快速入门教程之HealthKit框架体系创建 ...
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- iOS利用HealthKit框架从健康app中获取步数信息
微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为 ...
- [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续
英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...
- 译:Spring框架参考文档之IoC容器(未完成)
6. IoC容器 6.1 Spring IoC容器和bean介绍 这一章节介绍了Spring框架的控制反转(IoC)实现的原理.IoC也被称作依赖注入(DI).It is a process wher ...
- Firefly框架参考
在游戏服务器端,往往需要处理大量的各种各样的任务,每一项任务所需的系统资源也可能不同.而这些复杂的任务只用一个单独的服务器进程是很难支撑和管理起来的.所以,游戏服务器端的开发者往往需要花费大量的时间精 ...
- iOS Healthkit 使用探索分析 🌛
一 基本认知层面: HealthKit框架提供了一个结构,应用可以使用它来分享健康和健身数据.HealthKit管理从不同来源获得的数据,并根据用户的偏好设置,自动将不同来源的所有数据合并起来.应用还 ...
- iOS-几大框架的介绍
1.Objective-C之Foundation框架 概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objectiv ...
- iOS的主要框架介绍
框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框 ...
随机推荐
- safari的input问题
切图网用户体验团队QUX在手机移动触屏web前端开发中碰到一个问题 — 纯css3定义的按钮在android安卓系统下显示正常,但是在苹果ios系统下,以ipad为例,ipad下呈现渐变和圆角状态 . ...
- Starling开发微信打灰机(二)
上一篇中,已经把starling开发环境搭建好,那么现在开始写代码. 这一篇来完成打灰机的欢迎界面. 游戏素材下载 首先创建Asset.as来加载图片,声音和字体等资源,其中只有两张背景图是单独的图片 ...
- HDOJ-1041 Computer Transformation(找规律+大数运算)
http://acm.hdu.edu.cn/showproblem.php?pid=1041 有一个初始只有一个1的串 每次都按①0 -> 10;②1 -> 01;这两条规则进行替换 形如 ...
- IOS设备设计完整指南(转载)
http://blog.sina.com.cn/s/blog_6cc9af670102vq12.html
- 如何不让oracle使用linux的swap分区
经常看到swap分区被使用,被缓存的内容本来是为了增加命中率,结果去不断换入换出,导致本地磁盘IO增加,影响访问速度.所以在内存充足的情况下,如果我们觉得不需要使用swap分区的时候,那就要想办法尽量 ...
- magento后台登陆404、Front controller reached 100 router match iterations的解决方案
(1)执行如下sql SET SQL_SAFE_UPDATES=; SET FOREIGN_KEY_CHECKS=; UPDATE `core_store` SET store_id = WHERE ...
- leetcode_question_130 Surrounded Regions
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- scanf与printf用法详解
一.scanf家族 1.scanf家族的原型 int scanf(char const *format,...); int fscanf(FILE *stream,char const *format ...
- magento新闻邮件发送一直处于“正在发送”状态问题解决
今天在弄magento新闻邮件发送时候发现,单个邮件发送全然没有问题,可是新闻邮件订阅死活都不成功.国内国外的帖子都翻了一遍没实用,最后还是得靠自己了.于是開始慢慢找问题 首先想到是不是crontab ...
- oracle操作语句
Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名); create index index_userid on tbl_detail(userid);如何找 ...