HealthDataSync 是一个 Swift 库,旨在简化和自动化将 HealthKit 数据导出到外部存储的过程。最基本的使用方式仅需实现两个协议
一旦实现了所需的协议,就可以初始化 HDSManager 并使用它来请求用户授权访问 HDSExternalObjectProtocol 中定义的指定 HealthKit 数据类型;启动和停止底层的 HKObserverQuery,该查询将观察指定 HealthKit 数据类型的更改并在发生更改时回调您的应用程序;以及执行底层的 HKAnchoredObjectQuery 以获取请求的 HealthKit 数据中的更改,并将其与您的 HDSExternalStoreProtocol 实现同步。
HealthDataSync 使用 Swift Package Manager 来管理依赖项。 强烈建议您使用 Xcode 11 或更高版本将 HealthDataSync 添加到您的项目中。
当观察到的 HealthKit 数据类型发生更改时,HealthDataSync 库将回调您的“外部存储”以处理这些更改。 同步过程首先检查数据是否已通过调用 fetchObjects() 函数同步(无论 HealthKit 数据中的更改是创建、更新还是删除,都会调用 fetch objects)。
如果更改不是“删除”操作,并且“外部存储”返回 HDSExternalObjectProtocol 对象数组,则将调用 update() 函数以使用新的 HealthKit 数据更新 HDSExternalObjectProtocol 的实例。 如果未返回 HDSExternalObjectProtocol 对象,则将调用 add() 函数以添加新的 HealthKit 数据实例。
对于已删除的 HealthKit 数据,如果“外部存储”返回 HDSExternalObjectProtocol 对象数组,则将调用 delete() 函数以删除外部存储的数据。 但是,如果未返回 HDSExternalObjectProtocol 对象,则不会调用 delete() 函数。
public protocol HDSExternalStoreProtocol
{
/// Will be called to fetch objects from an external store.
func fetchObjects(with objects: [HDSExternalObjectProtocol], completion: @escaping ([HDSExternalObjectProtocol]? , Error?) -> Void)
/// Will be called to add new objects to an external store.
func add(objects: [HDSExternalObjectProtocol], completion: @escaping (Error?) -> Void)
/// Will be called to update existing objects in an external store
func update(objects: [HDSExternalObjectProtocol], completion: @escaping (Error?) -> Void)
/// Will be called to delete existing objects from an external store
func delete(deletedObjects: [HDSExternalObjectProtocol], completion: @escaping (Error?) -> Void)
}
HDSExternalObjectProtocol 定义了一种对象类型,用于将 HealthKit HKObject 映射到用于与外部存储同步的 DTO 实例。
当调用授权函数时,HDSManager 使用 authorizationTypes() 获取用户的读取许可,而 healthKitObjectType() 用于创建 HKObserverQuery 和 HKAnchoredObjectQuery 以监视 HealthKit 数据的变化。
在同步过程中,会调用静态函数以使用 HKObject 或 HKDeletedObject 初始化新的 HDSExternalObjectProtocol 对象。 如果操作是更新,则将在实例上调用 update 函数。
public protocol HDSExternalObjectProtocol
{
/// A unique identifier used to match HealthKit objects and External Objects.
var uuid: UUID { get set }
/// The HealthKit object type displayed to the user in the authorization UI.
static func authorizationTypes() -> [HKObjectType]?
/// The HealthKit object type used to query HealthKit.
static func healthKitObjectType() -> HKObjectType?
/// Creates a new External Object populated with data from the HKObject.=
static func externalObject(object: HKObject, converter: HDSConverterProtocol?) -> HDSExternalObjectProtocol?
/// Creates a new External Object populated with data from the HKDeletedObject.
static func externalObject(deletedObject: HKDeletedObject, converter: HDSConverterProtocol?) -> HDSExternalObjectProtocol?
/// Updates the External Object with data from the HKObject.
func update(with object: HKObject)
}
为简单起见,可以使用 HDSManagerFactory 类来创建单例 HDSManager。 通过调用 addObjectTypes() 传递您实现的 HDSExternalObjectProtocol 类型和您实现的 HDSExternalStoreProtocol,一旦创建了观察者,管理器就可以使用了。
重要提示:必须在 AppDelegate 的 application:didFinishLaunchingWithOptions: 函数中初始化 HDSManager,以处理应用程序未运行时 HealthKit 中的更改。
// Get the HDSManager.
let manager = HDSManagerFactory.manager()
// Initialize an instance of your external store.
let externalStore = ExampleExternalStore()
// Create observers by calling addObjectTypes.
manager.addObjectTypes(ExampleExternalObject.self, externalStore: ExampleExternalStore)
现在可以使用 HDSManager 了。 应用程序可以请求用户授予访问 HealthKit 的权限
manager.requestPermissionsForAllObservers(completion: { (success, error) in })
应用程序可以开始观察 HealthKit 中的更改
manager.startObserving()
本项目欢迎贡献和建议。 大多数贡献需要您同意贡献者许可协议 (CLA),声明您有权并将实际授予我们使用您的贡献的权利。 有关详细信息,请访问 https://cla.opensource.microsoft.com。
当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA,并对 PR 进行适当的装饰(例如,状态检查、评论)。 只需按照机器人提供的说明进行操作即可。 您只需在使用我们 CLA 的所有仓库中执行此操作一次。
还有许多其他方式可以为 HealthDataSync 项目做出贡献。
有关更多信息,请参阅 贡献 HealthDataSync。
本项目已采用 Microsoft 开源行为准则。 有关更多信息,请参阅行为准则常见问题解答或联系 opencode@microsoft.com 如有其他问题或意见。