我已成功将CKShare
URL保存到CloudKit,并且可以在CloudKit仪表板中看到该用户是INVITED
。我的Mac应用通过电子邮件将URL发送给该人,但是当他们单击该URL时,他们在icloud.com的该屏幕上都可以看到它:
点击确定会使所有内容消失,因此您所看到的只是网页的背景。
我的理解是,该URL应该可以在我的Mac应用程序中打开,它将在我的应用程序委托中触发userDidAcceptCloudKitShareWith
。却什么也没做。
这可能是因为我的应用程序正在开发中,而不是在Mac App Store中吗?我是否需要自定义URL方案才能使其打开我的应用?
有关此资料的文档非常少。我希望有人能提供任何帮助。
答案 0 :(得分:1)
此后,我了解到必须为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,并且希望完全控制共享工作流程。
我希望这对某人有帮助。 :)