我很难管理一个共享的核心数据对象。我希望我做错了什么,这不仅仅是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(控制器,动画:它总是有过时的数据,我刚刚删除的人仍然在那里,我也不能添加任何新的参与者。
我真的必须以某种方式弄清楚共享是否没有更多的参与者,然后自己从共享区域中删除它,并在我的私人区域中创建一个深副本。我很难相信它会有那么古怪。一定还有别的办法?如果您需要更多关于我的实施的见解,请告诉我。
1条答案
按热度按时间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),因为收件人的电子邮件客户端可能不兼容。如果是这样,他们将无法通过点击它来接受邀请。他们会得到一些神秘的错误信息。作为一种解决方法,他们可以将链接复制到兼容的应用程序中(例如注意)但到那时他们可能已经删除了你的应用程序。