Cli*_*rum 2 cloudkit cloudkit-sharing
我已成功将CKShareURL 保存到 CloudKit,并且可以看到用户位于INVITEDCloudKit 仪表板中。我的 Mac 应用程序通过电子邮件将 URL 发送给该人,但当他们单击该 URL 时,他们只能在 icloud.com 上看到此屏幕:
单击“确定”会使所有内容消失,因此您只能看到网页上的背景。
我的理解是,该 URL 应该打开我的 Mac 应用程序,它将userDidAcceptCloudKitShareWith在我的应用程序委托中触发。但它什么也没做。
这可能是因为我的应用程序正在开发中,尚未出现在 Mac App Store 中吗?我是否需要自定义 URL 方案才能打开我的应用程序?
关于这些东西的文档非常稀疏。我很乐意有人能提供的任何帮助。
我了解到您必须为 CloudKit 容器指定一个后备 URL。如果应用程序未安装(或未被识别,这似乎是像我一样在 Xcode 中进行开发构建时的情况),CloudKit 会将共享 URL 转发到您指定的位置。它们将唯一的共享 ID 附加到 URL,以便您可以在自己的网页上处理它。
在 CloudKit 仪表板中,转到环境设置...,您将看到以下弹出窗口:
我将其重定向到https://myapp.com/share/?id=并在其重定向到的网页上,我执行了一个操作$_GET['id']来获取id. 然后,我使用自定义 URL 方案再次重定向到我的应用程序并传递共享 ID(例如,共享 ID 在myapp://abc123哪里)。abc123
在我的应用程序委托中,我收到如下 URL:
func application(_ application: NSApplication, open urls: [URL]) {
if let url = urls.first, let shareId = url.host{
fetchShare(shareId) //<-- sharedId = abc123
}
}
Run Code Online (Sandbox Code Playgroud)
然后我用来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)
}
Run Code Online (Sandbox Code Playgroud)
NSItemProvider我认为使用和可以更简单地完成此操作NSSharingService,但我正在制作大量自定义 UI,并希望完全控制共享工作流程。
我希望这可以帮助别人。:)
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |