HealthKit
ios/framework
数据来源
HealthKit 中的数据来源主要有
Health and fitness devices
M7 motion coprocessor
健康数据被保存在叫 Health Store 的数据库中,而且被加密了,可以使用 HKHealthStore
类来访问。这个数据库存在于 iPhone 和 Apple Watch 中,他俩会自动同步,但是 Apple Watch 中的数据有可能会被系统自动清除以节省空间
隐私问题
用户可以控制 APP 可以访问哪些数据,但是 APP 自己不知道自己能访问什么数据。APP 只能向用户提出请求,用户可以允许或拒绝 APP 的请求,APP 自己却不知道用户到底是允许还是拒绝了请求。比如用户拒绝了APP 获取血压数据的请求,就算用户的健康数据中有血压数据,对于 APP 来说,血压数据是不存在的
关于使用 HealthKit 的注意事项
不要使用健康数据来打广告
除非获得了用户的允许,不要将健康数据给第三方机构
不能出售用户的健康数据
用户同意的话,你可以把健康数据提供给第三方机构以用于医学研究
你必须告诉用户你用健康数据的目的
健康数据分类
Health Store 中存储的健康数据分为下面几类
Characteristic data:这通常是不会改变的数据,包括用户的出生日期、血型、性别等,你可以直接通过
HKHealthStore
的dateOfBirth()
等方法直接访问Sample data:大部分的数据都是这个类型的
Source data:关于健康数据的来源的信息。
HKSourceRevision
和HKDevice
可以获得健康数据的来源于哪个 app 或者设备Deleted objects:不懂
HKObject
是所有 Sample 类数据的 superclass。每个这样的类都有下面的属性
UUID
Metadata
Source Revision:Sample 数据的来源
Device:产生 Sample 数据的设备
所有的 Sample 数据都是 HKSample
的子类。他有下面的属性
Type:表示数据类型,比如这是步数数据、睡眠数据
Start date:Sample 数据的起始时间
End date:Sample 数据的结束时间
Sample 还可以分为下面 4 种
Category samples:
HKCategorySample
Quantity samples:可以表示成数字的健康数据,大多数的数据都是这个类型,
HKQuantitySample
Correlations:多个 Quantity samples 的组合数据。HealthKit 中的食物和血压数据是这个类型的,
HKCorrelation
Workouts:健身数据,
HKWorkout
使用 HealthKit
在 Xcode 中启用 HealthKit
调用
HKHealthStore.isHealthDataAvailable()
来确定设备是否可以用健康数据如果可用,用
let healthStore = HKHealthStore()
获得HealthStore
的实例。这个实例是 long lived 的,每个 app 只需要一个实例获取使用健康数据的权限
在 Info.plist 中给出使用健康数据的理由
如果你没有请求权限,那么请求数据会导致错误
errorAuthorizationNotDetermined
;如果请求被拒绝了,会导致错误errorAuthorizationDenied
向 HealthStore 中写入和查询数据
获取健康数据
有 3 种获取健康数据的方法
Direct method calls:这主要用于获得 characteristic data,see
HKHealthStore
Queries:返回现在 HealthStore 中的数据的快照。它在另外一个 queue 中执行查询,提供一个 completion handler
Sample query:最常用的 query,所有的 sample data 都可以通过这个来获得。可以对查询的结果排序,对查询的范围进行限制。see
HKSampleQuery
Anchored object query:不太清楚,see
HKAnchoredObjectQuery
Statistics query:用于对查询的结果进行统计,例如统计健康数据的总数、平均数等。see
HKStatisticsQuery
Statistics collection query:对定长时间内的健康数据进行统计,比如每天消耗的卡路里数、每 5 分钟内走过的步数等。see
HKStatisticsCollectionQuery
Correlation query:进行与 correlation 相关的查询,see
HKCorrelation
Source query:对健康数据的来源(app 或者设备)进行查询,see
HKSourceQuery
Activity summary query:获得对用户的活动的 summary,可以是对一天或是对多天的 summary,see
HKActivitySummaryQuery
Document query:获取 health documents,see
HKDocumentQuery
Long running queries:这是运行在 anonymous background queue 的查询,当 HealthStore 的健康数据有更新、并且你也注册了 background delivery,它就能唤醒你的 APP
Observer query:当 HealthStore 的健康数据有更新、并且你也注册了 background delivery,它就能唤醒你的 APP,see
HKObserverQuery
Anchored object query:与上面的 Anchored object query 类似,可以运行在 anonymous background queue 中,但是不能注册 background delivery,see
HKAnchoredObjectQuery
Statistics collection query:与上面的 Statistics collection query 类似,可以运行在 anonymous background queue 中,但是不能注册 background delivery,see
HKStatisticsCollectionQuery
Activity summary query:与上面的 Activity summary query 类似,可以运行在 anonymous background queue 中,但是不能注册 background delivery,see
HKActivitySummaryQuery
单位与数量
类 HKUnit
表示一种单位,包括公制单位和英氏单位。single unit 表示简单的单位,如米、秒等;complex unit 表示由 single unit 组合而成的单位,如米每秒(m/s)等。更多的信息请看 HKUnit
类 HKQuantity
表示一次查询的结果,它所给出的值会与它所使用的单位有关,因此你可以非常方便的在不同单位之间转换,see HKQuantity
线程
HealthStore 是线程安全的
数字签名
不太清楚,主要是为了防止取出来的健康数据被修改