CloudKit CKShare URL 无处可去
Posted
技术标签:
【中文标题】CloudKit CKShare URL 无处可去【英文标题】:CloudKit CKShare URL Goes Nowhere 【发布时间】:2018-06-19 21:45:20 【问题描述】:我已成功将CKShare
URL 保存到CloudKit,我可以在CloudKit Dashboard 中看到用户是INVITED
。我的 Mac 应用程序通过电子邮件将 URL 发送给那个人,但是当他们单击它时,他们在 icloud.com 上的这个屏幕上看到的都是:
单击确定会使所有内容消失,因此您所看到的只是网页上的背景。
我的理解是 URL 应该打开我的 Mac 应用程序,它将在我的应用程序委托中触发 userDidAcceptCloudKitShareWith
。但它什么也没做。
这可能是因为我的应用程序正在开发中,而不是在 Mac App Store 中吗?我是否需要自定义 URL 方案才能打开我的应用程序?
关于这些东西的文档非常稀少。我希望有人能提供任何帮助。
【问题讨论】:
我直接使用链接时看到同样的情况;但是,如果您检查仪表板,您会注意到您的记录是共享的,并且如果您使用 UICloudSharingController 并将链接发送给其他人;他们将能够访问您的共享数据。我怀疑您需要向 URL 添加更多内容才能查看共享数据,可能记录在 CloudKit JS 文档中。 【参考方案1】:从那以后,我了解到您必须为 CloudKit 容器指定一个备用 URL。在未安装应用程序的情况下(或无法识别,这似乎是像我一样在 Xcode 中进行开发构建时的情况),CloudKit 会将共享 URL 转发到您指定的位置。他们将唯一的共享 ID 附加到 URL,以便您可以在自己的网页上处理它。
在 CloudKit 仪表板中,转到 Environment Settings...,您将看到以下弹出窗口:
我让它重定向到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 并希望完全控制共享工作流程。
我希望这对某人有所帮助。 :)
【讨论】:
Clifton,CloudKit 后备 URL 是否仍然适合您?它们最近似乎因我们的应用程序而损坏,我无法从 Apple 获得帮助。单击共享记录 URL 会导致 iCloud.com 网页显示“iCloud 已停止响应”,这是网页中 javascript 中的错误异常。谢谢! 嗯...我没有发现任何问题。是暂时中断还是仍然无法正常工作? 这种情况仍在发生,并且似乎已经发生了数周。您最近是否从您的应用程序中尝试过任何 CloudKit URL?这是我们应用程序中的示例 URL,它在 ios Safari 上运行,但在 macOS Safari、Chrome、Windows Edge 等上失败。icloud.com/share/0bjtbTTaM5b7bG1ff6dnKFbmg#Wizard_Stories以上是关于CloudKit CKShare URL 无处可去的主要内容,如果未能解决你的问题,请参考以下文章
如果所有者从 CloudKit 上的 CKShare 中删除我,如何通知我
CloudKit acceptShare 错误 - “无法获得共享身份集”
使用拼接删除 JSON 对象无处可去 - 那么我如何删除一大块数据?