swift CoreData + CloudKit共享在停止共享后中断

rxztt3cl  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(187)

我很难管理一个共享的核心数据对象。我希望我做错了什么,这不仅仅是cloudkit共享中的一个错误,而且我也尝试了苹果的一个样本应用程序,遇到了同样的问题。
这就是我在做的当共享一个新对象时,我这样调用UICloudSharingController

let cloudSharingController = UICloudSharingController {
        (controller, completion: @escaping (CKShare?, CKContainer?, Error?) -> Void) in
        container.share([myObject], to: nil) { objectIDs, share, container, error in
            if let actualShare = share {
                myObject.managedObjectContext?.performAndWait {
                    actualShare[CKShare.SystemFieldKey.title] = myObject.title
                }
            }
            completion(share, container, error)
        }
    }
    cloudSharingController.delegate = self
    present(cloudSharingController, animated: true)

这将打开系统共享对话框。例如,我选择“消息”,它会打开带有共享预览的消息应用程序,就可以了。现在当我取消分享时事情就变得有趣了。这几乎打破了我的整个应用程序。我无法再共享此对象或任何其他对象。我总是得到一个错误CKError 0x281611dd0: "Internal Error" (1/5002); "Couldn't encode share PCS data",所以它看起来是从这一点上损坏。如果我从共享中删除最后一个人,也会发生同样的情况。
我检查了CloudKit控制台,从我所看到的问题似乎是新创建的区域不再共享。如果我在cloudkit控制台中再次启用该区域的共享并重新启动应用程序,它会再次工作,我可以再次共享。
什么也坏了,如果我检查是否已经有一个共享我的对象,并提出了UICloudSharingController像这样,而不是:

let controller = UICloudSharingController(share: share, container: CKContainer(identifier: myIdentifier))

controller.delegate = self self.present(控制器,动画:它总是有过时的数据,我刚刚删除的人仍然在那里,我也不能添加任何新的参与者。
我真的必须以某种方式弄清楚共享是否没有更多的参与者,然后自己从共享区域中删除它,并在我的私人区域中创建一个深副本。我很难相信它会有那么古怪。一定还有别的办法?如果您需要更多关于我的实施的见解,请告诉我。

2j4z5cfb

2j4z5cfb1#

不幸的是,苹果的CloudKit共享实现并不好(尽管它在几年前得到了改进)。这是耗时的,以获得它的“权利”,你可能会被迫编写自己的版本的UICloudSharingController,以提供最佳的体验,为最终用户,因为你不能真正自定义它(例如,隐藏“停止共享”或“复制链接”按钮时,不需要)。此外,“共享”术语可能与用户的期望或理解不匹配。
如果您使用它,我建议您自己创建ckShare,然后只使用UICloudSharingController(share:,container:),因为另一种方法在第一次使用时(即,直到最终创建ckShare(这有时可能需要超过10秒)之前,似乎什么都没有发生。
但根据我的经验,你能做的最好的事情就是咬紧牙关,在不使用UICloudSharingController的情况下,将你需要的功能构建到你自己的应用程序中。这个来自苹果的项目有一个例子,一旦你用ckShare完成了你需要的一切,你就可以使用ShareLink。该项目也有一些很好的评论,警告你常见的陷阱:https://developer.apple.com/documentation/coredata/sharing_core_data_objects_between_icloud_users
--另外,请注意,使用电子邮件发送邀请时,共享过程很容易失败(最好坚持使用Messages或AirDrop),因为收件人的电子邮件客户端可能不兼容。如果是这样,他们将无法通过点击它来接受邀请。他们会得到一些神秘的错误信息。作为一种解决方法,他们可以将链接复制到兼容的应用程序中(例如注意)但到那时他们可能已经删除了你的应用程序。

相关问题