当需要 iCloud 时如何处理首次启动体验?

Poi*_*urn 6 core-data ios nsubiquitouskeyvaluestore cloudkit nspersistentcloudkitcontainer

我用来CloudKit存储公开可用的数据,并将新数据NSPersistentCloudKitContainer作为我的核心数据堆栈的一部分来存储/同步私有数据。

当用户打开我的应用程序时,他们处于以下 4 种状态之一:

  1. 他们是有权访问 iCloud 的新用户
  2. 他们是可以访问 iCloud 的回访用户
  3. 他们是新用户,但由于某种原因无法访问 iCloud
  4. 他们是回访用户,但由于某种原因无法访问 iCloud

状态 1 和状态 2 代表我的快乐路径。如果他们是新用户,我想在显示初始视图之前向用户的私人存储添加一些数据。如果他们是回头客,我想从核心数据中获取数据以传递到初始视图。

确定新/老用户: 我的计划是使用NSUbiquitousKeyValueStore. 我对此的担忧是处理以下情况: 下载应用程序 -> 被记录为之前启动过该应用程序 -> 删除并在新设备上重新安装/安装该应用程序 我认为NSUbiquitousKeyValueStore需要一些时间才能接收更新,因此我需要等待其完成同步,然后再进入初始视图。那么问题来了,如果他们无法访问 iCloud 会发生什么?NSUbiquitousKeyValueStore如果无法收到更新,如何告诉我他们是否是回访用户?

确定 iCloud 访问: 根据我所做的研究,我可以检查iCloudFileManager.default.ubiquityIdentityToken是否nil可用,但这不会告诉我原因。我必须用它CKContainer.default().accountStatus来了解为什么 iCloud 不可用。问题是这是一个异步调用,我的应用程序在了解他们的帐户状态是什么之前就会继续前进。

我对这个实在是摸不着头脑。优雅地确保所有这些状态都得到处理的最佳方法是什么?

Bri*_*n M 2

这里没有“正确”的答案,但我不认为 N​​SUbiquitiousKeyValueStore 会以任何方式获胜 - 就像你所说的,如果他们没有登录 iCloud 或没有网络访问权限,无论如何它都不会为他们工作。我目前已经使用 NSUbiquitiousKeyValueStore 完成了一些共享相关的工作,下次不会这样做。我真的希望 NSPersistentCloudKitContainer 支持 iOS 14 中的共享,这样我就可以一举清除我的大部分 CloudKit 代码。

如果您的应用程序在没有云访问的情况下无法运行,那么您可能只需放置一个屏幕来说明这一点,尽管总的来说这不是一个非常令人满意的用户体验。我的做法是将 iCloud 同步视为真正的异步(事实确实如此)。所以我允许用户开始使用该应用程序。然后您可以调用 accountStatus 以查看它是否在后台可用。如果是,则启动同步,如果不是,则等待,然后启动该过程。

因此,用户可以在设备上无限期地独立使用该应用程序,并且当他们连接到互联网时,他们在任何其他设备上所做的所有操作都会合并到他们在该新设备上所做的操作中。