HealthKit、核心数据和 CloudKit

Posted

技术标签:

【中文标题】HealthKit、核心数据和 CloudKit【英文标题】:HealthKit, Core Data and CloudKit 【发布时间】:2016-05-31 02:47:03 【问题描述】:

我正在构建一个与 HealthKit 集成的健身应用。最终,我也想使用 CloudKit 来 a) 允许数据冗余,但主要是 b) 提供一些社交功能,这些功能至少暂时需要数据在 iCloud 中。

我希望能够完全依赖 HealthKit 来获取应用程序内的数据,但我认为在 HealthKit 权限被撤销或一开始就没有授予的情况下,需要使用备用数据模型来保存数据。为此,我选择坚持使用 Core Data。

我的问题是如何让我的 Core Data 存储和我的 HealthKit 存储保持同步。我在 GitHub 上搜索了一个示例,并在此处搜索了相关问题,但找不到任何有用的示例。

最终我会将 Core Data 中的数据与 CloudKit 同步,但 Core Data 中介真的有必要吗?

关于 App Store 审核指南 27.3

使用 HealthKit 框架存储用户健康状况的应用 iCloud 中的信息将被拒绝

我认为这意味着任何不是由您的应用创建的健康数据都不能存储在 iCloud 中。有许多应用程序将健康数据存储在第三方服务器(即 RunKeeper)上。此外,如果没有 HealthKit 权限,我将被允许将我的应用程序创建的健康数据存储在 iCloud 中。如果您从 HealthKit 获取第三方数据并尝试将其放入 iCloud,那么您将被拒绝。

【问题讨论】:

【参考方案1】:

这里有几个问题,所以我会尝试按顺序回答。

...如何让我的 Core Data 存储和 HealthKit 存储保持同步?

因此,您需要担心两种应用程序模式来获取数据更新:前台和后台。

在前台时,您可以使用HKObserverQuery,它在获取所需数据方面提供了相当大的灵活性。当跨线程边界传递数据时(因为观察者查询在后台队列上运行),通常需要注意。相关文档:HKObserverQuery Docs

在后台,您必须使用enableBackgroundDeliveryForType(_:frequency:withCompletion:) 注册后台唤醒。这将以(或接近)指定频率唤醒您的应用程序,此时您需要跳过任何必要的环节来加载您的核心数据堆栈并进行更新。相关文档:HKHealthStore Background Handling Docs

...Core Data 中介真的有必要吗?

不,事实上,使用 Core Data 对您的使用来说可能完全是矫枉过正。我通常建议不要在应用程序开始时实现 Core Data。当您更改架构时,存在性能问题、后台唤醒问题、架构迁移问题以及 iCloud Core Data 同步问题(其中大部分已在 ios 9 中得到解决,但偶尔仍会出现)。

最重要的是,Apple 将 Core Data 包含在新项目中的“模板”通常不遵循集成 Core Data 的最佳实践指南。进行一些 Google 搜索并查看 Marcus Zarra 的有关该主题的书籍。

话虽如此,使用 Core Data 意味着必须编写更多代码才能使 iCloud 与您选择的数据存储同步,因此很难就“正确" 要走的路线。

我认为这意味着任何不是由您的应用创建的健康数据都不能存储在 iCloud 中。

不正确。以面值为准。如果 Apple 发现您已请求访问 HealthKit 并提供了 iCloud 访问权限,您可能会受到审查并且很可能会被拒绝。他们在这方面对用户隐私非常敏感,我认为这是正确的。

您关于 Runkeeper 的注释虽然准确,但也存在缺陷,因为 Runkeeper(我上次检查过)不使用 iCloud,因此不受此限制,因此类比存在缺陷。此外,根据 Apple 的其他指南,无论其他应用做什么或不做什么都不会影响您的应用程序的审核状态。

简而言之,我会避免将用户的健康数据存储在 iCloud 中。使用其他提供商或您自己的服务器。

【讨论】:

我觉得奇怪的是,您可以在 iCloud 中存储健康数据,但不能存储健康数据。也许传闻中 iCloud 中更强大的安全性将改变这一规则。感谢您的详尽回复。 当然可以,是的,我同意这很奇怪,但在他们加强 iCloud 的安全性之前,我个人也不希望我的健康数据放在那里 :)

以上是关于HealthKit、核心数据和 CloudKit的主要内容,如果未能解决你的问题,请参考以下文章

从 HealthKit 存储数据

iOS Healthkit 使用探索分析 🌛

HealthKit 读取数据心率和血压“同步后的最新更新”

HealthKit 读取数据心率和血压“同步后的最新更新”

使用 Combine 的发布者和订阅者发布实时 HealthKit 数据?

使用 Combine 的发布者和订阅者发布实时 HealthKit 数据?