1. 介绍
HealthKit是苹果提供的一个框架, 用来访问和分享健康和健身数据, HealthKit为健康和健身数据提供了一个中心仓库, 在用户授权后, app可以通过HealthKit store 访问分享这些数据. HealthKit 提供了大量的数据类型和单位, 用不不允许自己创建数据类型和单位,
2. HealthKit 数据
-
特征数据(
Characteristic data
), 如生日, 血型, 皮肤, 生物性别等, 用户可以直接读取, 但是输入的话必须在健康app中. -
样本数据(
Sample data
), 大多数的用户健康数据都是通过样本数据进行存储的, 所有的样本类都继承自
HKSample类
, 它又是
HKObject类
的子类 -
训练数据(
Workout data
): 健身锻炼的数据是通过HKWorkout 进行存储的, HKWorkout也是HKSample的子类 -
元数据(
source data
): 每个样本数据都存储关于数据的来源,
HKSourceRevision
对象包含app或设备存储的数据.
HKDevice
对象包含关于产生数据的硬件设备的信息. -
删除的对象:
HKDeletedObject
实例用来暂时存储已经被删除的item的UUID. 当一个数据被用户或者其他app删除, 可以用这个对象响应
3. HKObjects和Sample的属性
HKObject
是所有HealthKit sample类型的父类, ‘HKObject’的所有子类都是不可变的, 属性如下:
- UUID: 条目的唯一标识
- Metadata: 一个字典, 包含该条目的额外信息, 字典可以包含预设和自定义的key,
- Source Revision: sample的来源, 可以是直接把数据存进HealthKit的设备或者app, HealthKit 自动记录每个对象的来源和版本当一条数据存进来的时候, 这个属性只有当这个对象从healthKit store 中取出来的时候有效
- Device: 生成数据的硬件设备
所有的HKSample类都是HKObject的子类, 所有的sample类都是HKSample的子类, 属性如下:
- Type: 样本的类型, 如睡眠分析类型, 身高sample, step count sample.
- Start date: 样本数据的开始时间
- End date: 样本数据的结束时间, 如果样本数据仅仅代表一个时间点的数据, 则结束时间应该和开始时间是一样的, 否则, 结束时间应该晚于开始时间
sample 对进一步划分为四个子类
- Category samples: 可以划分为有限类别的数据
- Quantity sample: 可以存储为数值类型的数据, 是最长用的数据类型, 他们包括身高, 体重, 步数, 用户的温度, 脉搏速度等等
- Correlation: 包含一个或者多个sample的复合数据, 在iOS8, HealthKit用这个类型的数据来代表食物, 血压等等, 当你创建食物或者血压数据的时候也应该使用者这个类型
- Workouts: 训练数据, 代表物理训练, 如跑步, 游泳, 训练数据通常有类型, 时长, 距离, 能量消耗等属性, fine-grained, 你可以将训练数据与一些细粒度的sample关联,
HealthKit store 是线程安全的, 大多数HealthKit object是不可变的, 一般情况你可以在多线程环境中使用它
HealthKit的所有回调函数都没有在主线程中执行, 如果你要刷新UI记得切换到主线程
iphone和apple watcch中的数据会自动同步, 为了节省空间, 手表会定期清除旧数据, iPad没有healthKit
4. 配置HealthKit
-
在app中允许HealthKit
-
确保HealthKit在当前手机有效
if (HKHealthStore.isHealthDataAvailable) { self.store = [[HKHealthStore alloc]init];; }else { NSLog(@"aikesi--当前设备不支持HealthKit"); }
-
创建自己的HealthKit store
-
请求授权读写数据
为了保护用户隐私, HealthKit要求对每种数据类型,app必须要申请细粒度的授权, 但是可以不用一次申请完, 要用的时候申请也是可以的
let allTypes = Set([HKObjectType.workoutType(),
HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKObjectType.quantityType(forIdentifier: .distanceCycling)!,
HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKObjectType.quantityType(forIdentifier: .heartRate)!])
healthStore.requestAuthorization(toShare: allTypes, read: allTypes) { (success, error) in
if !success {
// Handle the error here.
}
}
版权声明:本文为qq_15906567原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。