CloudKit 在不同的 iCloud 帐户之间共享数据,但不是与所有人共享

CloudKit share Data between different iCloud accounts but not with everyone

在我的应用程序中,我想通过 iCloud 与其他 iCloud 用户共享数据,但不是与全世界共享数据,而是与选定的其他 iCloud 用户共享数据。

我想过一个可行的方法,但我不确定它是否可行,以及我是否忘记或误解了一些事情。

假设用户 A 希望能够与其他 iCloud 用户共享字符串,但不想与所有人共享。因此,用户 A 想与用户 B 共享“Hello World”,但不想与用户 C 和用户 D 共享。

所以我的应用程序有一个 Public 数据库和一个对每个人都相同的记录类型。在该记录类型中,有一个字符串类型的字段,对每个人来说也是相同的。

现在用户A将记录“Hello World”保存到iCloud。诀窍来了:我会在字符串中添加一个唯一标识符,如 UUID,以便将“Hello World1230ABD6-3C61-1234-802E-D866F09AC012”之类的内容上传到 iCloud。

现在用户 A 需要告诉用户他想用他的 UUID 共享数据,所以用户 A 告诉用户 B。现在用户 A 的 UUID 将作为谓词添加到用户 B 的 CKSubscription .

这将允许用户 B 从用户 A 获取字符串,但用户 C 或用户 D 不会收到 CKNotification,因为他们的 CKSubscription 中没有用户 A 的 UUID。

这行得通吗?或者是否有另一种设计模式允许 sharing/syncing 通过 iCloud 与其他 iCloud 帐户但不是所有人 (public)?

P.S。我要共享的数据不敏感,因此不需要非常安全。并不是每个人都对这些数据感兴趣 (public),因此它只需要与选定的其他 iCloud 帐户共享...

感谢您提供有关如何实现此目标的任何想法或提示!

谢谢

有几种方法可以实现这样的目标。在所有情况下,它归结为:

  • 添加一个 CKReference 字段,该字段将填充您要与之共享的用户的 ID。
  • 确保您的谓词将过滤 ID 是您的(与您共享)的 CKReference 字段

您存储 CKReference 的位置和方式取决于您想要共享的方式。

  • 如果您只想与一个人共享,则只需将该 CKReference 字段包含到您的主 recordType 中即可。不要像您在问题中所说的那样将其添加到消息中。添加一个额外的字段。
  • 如果你想分享给有限数量的人,那么你可以在你的记录类型中添加一个字段,它是一个 CKReference 列表。
  • 如果您想与一大群人共享,那么您可以添加一个组 recordType,它有一个 groupID 加上一个 groupMembers 记录类型,您可以在其中存储属于该组成员的所有用户 CKReference id。

在所有情况下,解决方案都是安全的。这一切都归结为您在应用程序中定义的谓词。如果您的谓词过滤器之一不正确,那么可能有人会看到不适合他的东西。

EVCloudKitDao的演示应用程序中是一个基于CloudKit的聊天应用程序。它使用便利库 EVCloudKitDao,但共享内容的结构类似。

CloudKit 共享是在 WWDC 2016 上引入的。这允许在一组已知用户之间共享私人数据库记录,这听起来就像您正在寻找的那样。 …… "What's new in CloudKit" session 中有一个很好的概述:https://developer.apple.com/videos/play/wwdc2016/226/