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)

我认为使用 NSItemProviderNSSharingService 可以更轻松地解决此问题,但我正在做很多自定义 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 中删除我,如何通知我

使用 CKShare 订阅

CloudKit acceptShare 错误 - “无法获得共享身份集”

使用拼接删除 JSON 对象无处可去 - 那么我如何删除一大块数据?

Backbone.js PushState 路由 .htaccess 仅作为散列工作,但无处可去

如何获取已存在共享的 CKShare 对象(获取共享 URL)