【问题标题】:Users can't open CKShare record when they accepted the record and application starts用户在接受记录和应用程序启动时无法打开 CKShare 记录
【发布时间】:2020-05-19 22:50:33
【问题描述】:

通过实现 CloudKit 的 CKShare 功能以我的方式工作。 我已经设法到达共享记录的部分(例如通过电子邮件),并且还可以确认用户收到了邀请。问题是,当用户接受记录时,应用程序会弹出但没有任何反应。为了提供帮助,这里是应用程序的一些关键元素,如果我错了,请告诉我。

1) 该应用程序不需要用户使用他们的 Apple ID 登录

2) 当我使用电缆将手机连接到计算机时(也就是尚未使用 TestFlight),我正在通过直接在两部不同手机(具有单独的 Apple ID)上构建的应用程序进行测试。

3) 我已在 CloudkitDashboard 中查看,我可以看到已共享的记录,也可以看到已共享的记录,但我没有看到用户电子邮件,而是我发送了邀请,我看到了我的电子邮件以及以下事实记录哈哈被“接受”了

4) 我在 Info.plist 文件中添加了 CKSharingSupported 键。

5) AppDelegate.swift 文件中用于接受 CKShare 的代码如下。我很想引起您对“用户接受共享”字符串永远不会打印的事实的关注,这让我认为这部分代码永远不会运行。

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {

    print("User Accepted the Share")
    let acceptShareOperation: CKAcceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])

    acceptShareOperation.qualityOfService = .userInteractive
    acceptShareOperation.perShareCompletionBlock = {meta, share,
        error in
        print("The Record Share was Accepted")
    }
    acceptShareOperation.acceptSharesCompletionBlock = {
        error in
        /// Send your user to where they need to go in your app
        let viewController: SNPDetailsViewController = self.window?.rootViewController as! SNPDetailsViewController
        viewController.fetchShare(cloudKitShareMetadata)
    }
    CKContainer(identifier:
        cloudKitShareMetadata.containerIdentifier).add(acceptShareOperation)
}

任何能指导我哪里出错的见解,将不胜感激。

感谢您的宝贵时间!

【问题讨论】:

    标签: ios swift metadata cloudkit ckshare


    【解决方案1】:

    有关更多上下文,请参阅此答案:CloudKit CKShare URL Goes Nowhere

    但请确保:

    1. 您为重定向到您的应用程序的 CloudKit 容器指定一个备用 URL。
    2. 在 Xcode 中的应用程序内部,您设置了一个 URL 方案,以便 yourapp:// 之类的自定义 URL 打开您的应用程序,并将备用 URL 中的查询参数传递到 userDidAcceptCloudKitShareWith

    【讨论】:

      【解决方案2】:

      经过数周的反复试验、研究和运气,我设法找出了问题所在。所有教程和在线解决方案都与 AppDelegate.swift 中的以下代码相关,以接受 CKShare 记录:

      func application(_ application: UIApplication, userDidAcceptCloudKitShareWith    cloudKitShareMetadata: CKShare.Metadata) {
        let acceptShareOperation: CKAcceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
        acceptShareOperation.qualityOfService = .userInteractive
        acceptShareOperation.perShareCompletionBlock = {meta, share,
              error in
                  DispatchQueue.main.async() {
                      print("The Record Share was Accepted")
                  }
              }
             acceptShareOperation.acceptSharesCompletionBlock = {
              error in
                  guard (error == nil) else{
                      print("Error \(error?.localizedDescription ?? "")")
                      return
                  }
              let viewController: SNPDetailsViewController = self.window?.rootViewController as! SNPDetailsViewController
              viewController.fetchShare(cloudKitShareMetadata)
             }
          CKContainer(identifier:
              cloudKitShareMetadata.containerIdentifier).add(acceptShareOperation)
      }
      

      我的解决方案是将其添加到 SceneDelegate.swift 的以下函数中:

      func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
      (add above code)
      }
      

      希望这对其他人有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 2015-07-16
        • 1970-01-01
        • 2019-01-05
        • 2011-09-01
        • 2011-12-25
        • 1970-01-01
        相关资源
        最近更新 更多