代码之家  ›  专栏  ›  技术社区  ›  Clifton Labrum

CloudKit CKShare URL不存在

  •  0
  • Clifton Labrum  · 技术社区  · 8 年前

    我成功地保存了 CKShare CloudKit的URL,我可以看到用户是 INVITED

    Shared

    点击

    我的理解是,这个URL应该打开我的Mac应用程序 userDidAcceptCloudKitShareWith

    这可能是因为我的应用程序正在开发中,而不是在Mac应用程序商店中?我需要一个自定义的URL方案来打开我的应用程序吗?

    关于这些东西的文档非常稀少。我希望有人能提供任何帮助。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Clifton Labrum    8 年前

    我后来了解到,您必须为CloudKit容器指定一个回退URL。如果应用程序没有安装(或者无法识别,就像我在Xcode中进行开发构建时一样),CloudKit会将共享URL转发到您指定的位置。它们将唯一的共享ID附加到URL,以便您可以在自己的网页上处理它。

    你会看到这个弹出窗口:

    Development Environment Settings

    我把它重定向到 https://myapp.com/share/?id= $_GET['id'] 抓住 id . 然后使用 自定义URL方案 myapp://abc123 哪里 abc123 是共享ID)。

    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