【问题标题】:Share Core Data between users with NSPersistentCloudKitContainer使用 NSPersistentCloudKitContainer 在用户之间共享核心数据
【发布时间】:2019-11-08 03:47:55
【问题描述】:

Apple 在 iOS 13 中引入了NSPersistentCloudKitContainer,这使我们能够将 CloudKit 与 Core Data 一起使用。我几乎可以立即在不同的设备上运行它,但我的主要问题仍然存在。

是否可以轻松地与其他用户共享数据? 我一直在阅读CKShare,但不知道如何以简单的方式从NSPersistentCloudKitContainer 转到那里。

【问题讨论】:

  • 我不相信您可以 - 如果您直接使用 CloudKit,那么您可以选择在公共数据库中创建记录(然后您的应用程序的所有用户都可以访问这些记录),或者您可以选择使用 CKShare 共享私有数据库中的特定记录 - 当您使用 NSPersistentCloudKitContainer 时,CloudKit 实现对您隐藏,因此您无法创建所需的 CKShare
  • @Paulw11 你应该把它写成这个问题的答案,因为我相信你说的是正确的。 :)
  • 你找到答案了吗?看来我们可以轻松地将 CKShare 添加到镜像区域中的镜像记录中,但问题仍然是当它出现在另一侧的共享数据库中时如何将其同步回来。
  • 我可以检索 CKRecord 并创建一个 CKShare(请参阅我对橙色答案的评论)。不幸的是,这行不通,因为此共享永远不会出现在共享数据库区域中......也许下一个 WWDC 会帮助我们或为我们带来答案

标签: ios core-data cloudkit ckshare nspersistentcloudkitcontainer


【解决方案1】:

正如 WWDC 2021 中所宣布的,您现在可以与其他 iCloud 用户共享。 https://developer.apple.com/videos/play/wwdc2021/10015/

【讨论】:

    【解决方案2】:

    现在看来,这可以通过新的 databaseScope 属性在 iOS 14.0+ Beta 和 macOS 11.0+ Beta 中实现:https://developer.apple.com/documentation/coredata/nspersistentcloudkitcontaineroptions/3580372-databasescope

    可能的值是 .public(公共数据库)、.private(私有数据库)和 .shared(共享数据库) )。

    例如:

    let container = NSPersistentCloudKitContainer(name: "test")
    guard let description = container.persistentStoreDescription.first else {
    fatalError("Error")
    }
    description.cloudKitContainerOptions?.databaseScope = .shared
    

    视频https://developer.apple.com/videos/play/wwdc2020/10650 描述了如何通过将databaseScope 值设置为.public 来将Core Data 存储与CloudKit 公共数据库同步。

    [更新] 不幸的是,似乎(还没有?)支持共享,尽管databaseScope = .shared 属性表明不支持。请参阅 https://developer.apple.com/forums/thread/649630?login=true&page=1#621748022 正如下面 Brian M 所指出的那样。

    【讨论】:

    • 公共数据库可用,共享数据库不可用。必须通过从NSManagedObjectID 获取CKRecord 来完成。在这里,您可以创建一个CKShare。并且你需要订阅CKDatabaseSubscription
    • @FlorentMorin 你能找到关于它只公开而不共享的文档吗?
    • Apple 工程师的这个回答听起来并不乐观。 developer.apple.com/forums/thread/…。 @FlorentMorin 或 Bas the Developer,你们中的任何一个都有这个工作吗?
    • @Ben : 关于 CloudKit + Core Data 的最后一次 WWDC 会议developer.apple.com/wwdc20/10650
    • 嘿@bodich 我可以想象这是一个正确的痛苦,干得好,我想使用同步创建几个应用程序,NSPersistantCloudKitContainer 大大降低了复杂性。不幸的是,我决定等到这个功能可用,过去在 iCloud 上浪费了很多时间?
    【解决方案3】:

    在 NSPersistentCloudKitContainer 上有访问底层 cloudkit 记录的方法:https://developer.apple.com/documentation/coredata/nspersistentcloudkitcontainer。例如,

    func record(for managedObjectID: NSManagedObjectID) -> CKRecord?
    

    所以理论上你可以使用这个方法来获取一个 CKRecord 然后手动创建一个 CKShare。

    但是从当前的 beta 版本(beta 3)开始,这些方法似乎返回 nil。如果他们想隐藏实现,他们似乎不会包含这些方法。所以我们在这个地方,您可以自己实现整个同步并获得共享,或者使用他们的同步实现但不能获得共享。我希望这些方法缺乏实现只是一个早期的 beta 问题。

    【讨论】:

    • 我确实设法获取了记录并从中创建了一个 CKShare ...但最终 CoreData 的 CloudKit 容器将永远不会出现在共享区域中...也许我们将不得不等待下一个 WWDC - 祈祷吧。
    • 有人成功了吗?我已经实现了设置父记录,但有时获取 Core Data 会导致 CoreDataMirroring 崩溃(当我在互联网恢复时这样做)并且它显示“可能没有互联网”,直到我重新启动应用程序。 Core Data 没有任何回调或状态检查,所以除了有时与自动 CoreData+CloudKit 镜像同时进行之外,我无能为力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多