无法共享 CloudKit CKShare 记录

Posted

技术标签:

【中文标题】无法共享 CloudKit CKShare 记录【英文标题】:Cannot share CloudKit CKShare record 【发布时间】:2017-02-09 22:33:50 【问题描述】:

我正在尝试在我的应用程序中实现云工具包共享,但是,每当我尝试使用 UICloudSharingController 共享项目时,我都会收到一致的错误:

我会看到用于添加人员的初始共享弹出框,然后当我选择有关我希望如何发送邀请的选项之一(即:通过邮件)时,UICloudSharingControllerDelegate 会返回呼叫:

func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error)

并抛出错误:

CKError 0x170245d60:“无效参数”(12); “正在保存添加的共享,但没有根记录(CKRecordID:0x1700343e0;recordName=C9FA0E96-3461-4C9E-AB99-3B342A37A07A,zoneID=PrivateDatabase:__defaultOwner_)”

我已经在私有云数据库中为 zoneId 为“PrivateDatabase”的用户创建了一个自定义区域。我创建了一个对象并成功将其保存到 iCloud,它链接到我之前创建的自定义区域。我用来呈现 UICloudSharingController 的代码如下:

let object = // A core data representation of a CKRecord //

let share = CKShare(rootRecord: object.record) //record is a CKRecord that is stored with the core data object 
share[CKShareTitleKey] = object.name as? CKRecordValue
share[CKShareThumbnailImageDataKey] = UIImagePNGRepresentation(object.categoryKey.icon()) as? CKRecordValue
share[CKShareTypeKey] = "reverse.domain" as CKRecordValue
share.publicPermission = .readOnly

let sharingController = UICloudSharingController(share: share, container: self.container)
sharingController.delegate = self
sharingController.availablePermissions = [.allowPrivate, .allowReadOnly]
sharingController.popoverPresentationController?.sourceView = sourceView
controller.present(sharingController, animated: true, completion: nil)

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

您为 UICloudSharingController 的实例使用了错误的初始化程序。 对于两个不同的用例,有两个不同的初始化程序

如果第一次共享项目(尚未共享),您必须使用 rootRecord 创建一个新的 CKShare 实例(就像您在代码中所做的那样),但是您必须使用此 Initializer init(preparationHandler:) 初始化您的 UICloudSharingController 如果项目已经在共享过程中,那么您必须从 iCloud 获取现有共享并使用此 Initializer init(share:container:) 初始化您的 UICloudSharingController

因此,您的错误是,您创建了一个新的 CKShare 实例,但随后使用了错误的初始化程序。

more from Apple

【讨论】:

【参考方案2】:

您是否检查了 iCloud,共享是否具有指向正确区域中根记录的正确链接等,和/或 rootRecord 是否存在...

【讨论】:

刚刚查看了 WWDC2016,这就是我的意思:“..您总是需要创建一个带有根记录的共享,因此共享中总会有一些东西。接下来,我们将保存该共享并将根记录同时发送到服务器。您想要这样做是因为 CKRecord 上有一个新属性,它是对我们正在创建的共享的引用。通过同时保存根记录和共享,引用将设置为您刚刚创建的共享......" 我已经检查过了,我已经使用 CloudKit 提供给我的 rootRecord 创建了共享。这个问题仍然存在。

以上是关于无法共享 CloudKit CKShare 记录的主要内容,如果未能解决你的问题,请参考以下文章

如果所有者从 CloudKit 上的 CKShare 中删除我,如何通知我

CloudKit acceptShare 错误 - “无法获得共享身份集”

CloudKit 共享工作流程结束于:要打开它,您需要最新版本的“app_name”

CloudKit CKShare URL 无处可去

如何删除CKShare?

如何获取已存在共享的 CKShare 对象(获取共享 URL)