CloudKit CKShare URL无处可去

时间:2018-06-19 21:45:20

标签: cloudkit cloudkit-sharing

我已成功将CKShare URL保存到CloudKit,并且可以在CloudKit仪表板中看到该用户是INVITED。我的Mac应用通过电子邮件将URL发送给该人,但是当他们单击该URL时,他们在icloud.com的该屏幕上都可以看到它:

Shared

点击确定会使所有内容消失,因此您所看到的只是网页的背景。

我的理解是,该URL应该可以在我的Mac应用程序中打开,它将在我的应用程序委托中触发userDidAcceptCloudKitShareWith。却什么也没做。

这可能是因为我的应用程序正在开发中,而不是在Mac App Store中吗?我是否需要自定义URL方案才能使其打开我的应用?

有关此资料的文档非常少。我希望有人能提供任何帮助。

1 个答案:

答案 0 :(得分:1)

此后,我了解到必须为CloudKit容器指定一个备用URL。如果未安装该应用程序(或无法识别该应用程序,例如在像我一样在Xcode中进行开发构建时,情况似乎如此),CloudKit会将共享URL转发到您指定的位置。他们将唯一的共享ID附加到URL,以便您可以在自己的网页上对其进行处理。

在CloudKit仪表板中,转到环境设置... ,您将看到此弹出窗口:

Development 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,并且希望完全控制共享工作流程。

我希望这对某人有帮助。 :)