我已经成功地将CKShare URL保存到CloudKit,并且可以看到用户是CloudKit仪表板中的INVITED。我的Mac应用程序给那个人发了电子邮件,但当他们点击它时,他们在icloud.com上看到的都是这个屏幕:

单击OK会使一切消失,所以您所看到的只是网页上的背景。
我的理解是,URL应该打开我的Mac应用程序,它将在我的应用程序委托中触发userDidAcceptCloudKitShareWith。但它什么也做不了。
这可能是因为我的应用程序正在开发中,而不是在Mac中吗?我需要一个自定义的URL方案来让它打开我的应用程序吗?
关于这些东西的文档非常稀少。我希望有人能提供任何帮助。
发布于 2018-06-20 17:57:04
我已经了解到,您必须为您的CloudKit容器指定一个备用URL。如果应用程序没有安装(或者没有被识别,就像我一样在使用Xcode进行开发时),CloudKit会将共享URL转发到您指定的某个位置。它们将唯一的共享ID附加到URL,以便您可以在自己的网页上处理它。
在CloudKit仪表板中,转到环境设置.,您将看到以下弹出:

我让它重定向到https://myapp.com/share/?id=,在它重定向到的网页上,我做了一个$_GET['id']来获取id。然后,我使用自定义URL方案再次重定向到我的应用程序,并传递共享ID (例如,myapp://abc123,其中abc123是共享ID)。
在我的应用程序委托中,我收到如下URL:
func application(_ application: NSApplication, open urls: [URL]) {
if let url = urls.first, let shareId = url.host{
fetchShare(shareId) //<-- sharedId = abc123
}
}然后,我使用CKFetchShareMetadataOperation查找共享的URL,并使用CKAcceptSharesOperation来接受它,如下所示:
func fetchShare(shareId: String){
if let url = URL(string: "https://www.icloud.com/share/\(shareId)"){
let operation = CKFetchShareMetadataOperation(shareURLs: [url])
operation.perShareMetadataBlock = { url, metadata, error in
if let metadata = metadata{
//:::
acceptShare(metadata: metadata)
}
}
operation.fetchShareMetadataCompletionBlock = { error in
if let error = error{
print("fetch Share error: \(error)")
}
}
CKContainer.default().add(operation)
}
}
func acceptShare(metadata: CKShareMetadata){
let operation = CKAcceptSharesOperation(shareMetadatas: [metadata])
operation.acceptSharesCompletionBlock = { error in
if let error = error{
print("accept share error: \(error)")
}else{
//Share accepted!
}
}
CKContainer.default().add(operation)
}我认为有更简单的方法可以使用NSItemProvider和NSSharingService来解决这个问题,但是我正在做很多定制的UI,并且希望完全控制共享工作流。
我希望这能帮上忙。:)
https://stackoverflow.com/questions/50937353
复制相似问题