0

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

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

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

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

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

5) AppDelegate.swift 文件中用于接受 CKShare 的代码如下。我希望您注意字符串“User Accepted the Share”永远不会被打印出来,这让我认为这部分代码永远不会运行。

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)
}

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

感谢您的时间!

4

2 回答 2

1

请参阅此答案以获取更多上下文:CloudKit CKShare URL Goes Nowhere

但请确保:

  1. 您为重定向到您的应用程序的 CloudKit 容器指定一个备用 URL。
  2. 在 Xcode 中的应用程序内部,您设置了一个 URL 方案,以便自定义 URL(如yourapp://打开应用程序)和来自备用 URL 的查询参数传递到userDidAcceptCloudKitShareWith.
于 2020-05-22T17:06:35.353 回答
0

经过数周的反复试验、研究和运气,我设法找出了问题所在。所有教程和在线解决方案都与 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)
}

希望这对其他人有帮助!

于 2020-06-01T20:12:12.690 回答