无法共享 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 实例(就像您在代码中所做的那样),但是您必须使用此 Initializerinit(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 错误 - “无法获得共享身份集”