HealthKit、核心数据和 CloudKit

HealthKit, Core Data and CloudKit

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

我希望能够完全依赖 HealthKit 来获取应用程序中的数据,但我觉得有必要使用备用数据模型来保存数据,以防 HealthKit 权限被撤销或一开始就没有给予。为此,我选择坚持使用 Core Data。

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

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

关于 App Store 审核指南 27.3

Apps using the HealthKit framework that store users’ health information in iCloud will be rejected

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

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

...如何让我的核心数据存储和我的 HealthKit 存储保持同步?

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

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

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

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

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

最重要的是,Apple "template" 在新项目中包含 Core Data 通常不遵循集成 Core Data 的最佳实践指南。进行一些 Google 搜索并阅读 Marcus Zarra 关于该主题的书籍。

综上所述,使用 Core Data 意味着必须编写更多代码才能使 iCloud 与您选择的数据存储同步,因此很难提供建议至于要走的"correct"路线。

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

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

你关于 Runkeeper 的说明虽然准确,但也有缺陷,因为 Runkeeper(我最后检查过)不使用 iCloud,因此不受此限制,所以这个类比是有缺陷的。此外,根据 Apple 的其他指南,无论其他应用做什么或不做什么,都不会影响您的应用程序的审核状态。

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