3

我正在努力CKShare在 Swift 4 的 macOS 应用程序中接受 a。我已经完成了以下所有操作:

  • 创建CKShare并将其保存rootRecord到 CloudKit
  • 添加参与者 ( CKShare.Participant)
  • 我已经确认它CKShare在 CloudKit 服务器上,并且我邀请的人可以访问它。这是截图:https ://d.pr/i/0sMFQq

当我单击与 关联的共享链接时CKShare,它会打开我的应用程序,但没有任何反应并且userDidAcceptCloudKitShareWith不会触发。

func application(_ application: NSApplication, userDidAcceptCloudKitShareWith metadata: CKShareMetadata) {
  print("Made it!") //<-- This never gets logged :(
  let shareOperation = CKAcceptSharesOperation(shareMetadatas: [metadata])
  shareOperation.qualityOfService = .userInteractive

  shareOperation.perShareCompletionBlock = {meta, share, error in
    print("meta \(meta)\nshare \(share)\nerror \(error)")
  }
  shareOperation.acceptSharesCompletionBlock = { error in
    if let error = error{
      print("error in accept share completion \(error)")
    }else{
      //Send your user to where they need to go in your app
      print("successful share:\n\(metadata)")
    }
  }

  CKContainer.default().add(shareOperation)
}

我必须在 info.plist 中包含某种 URL 方案吗?或者也许是我需要在我的NSApplicationDelegate代表中遵守的协议?对于我的一生,我无法弄清楚该怎么做。提前致谢!

更新

我已经尝试了更多的东西。当我在网络浏览器中打开共享链接时,我看到:

在此处输入图像描述

单击“确定”会使屏幕逐渐消失:

没有什么

不是特别有帮助。:) 这样做之后,参与者在 CloudKit 中的状态仍然是Invited,所以共享仍然没有被接受。

当我单击消息中的共享链接时,我会看到如下弹出窗口: CloudKit 分享弹窗 单击打开后,我的应用程序的新副本出现在 Dock 中,然后应用程序突然关闭。崩溃日志指出:

由于未捕获的异常“CKException”而终止应用程序,原因:“应用程序缺少必需的权利 com.apple.developer.icloud-services”

我尝试在 Xcode 的 Capabilities 部分中关闭再打开 iCloud,但没有任何变化。我知道这个例外是不对的,因为我可以正常启动我的应用程序并整天使用 CloudKit。只有CKShare导致此崩溃的原因。

这是一团糟。救救我,欧比旺克诺比,你是我唯一的希望。

4

4 回答 4

3

是的,

您需要将此添加到您的 info.plist。

<key>CKSharingSupported</key>
<true/>

**编辑的答案**

我使用此代码共享,我不手动执行...不确定这是否是 OS XI 必须承认的选项。我正在使用 iOS。

let share = CKShare(rootRecord: record2S!)
share[CKShareTitleKey] = "My Next Share" as CKRecordValue
share.publicPermission = .none

let sharingController = UICloudSharingController(preparationHandler: {(UICloudSharingController, handler:
                    @escaping (CKShare?, CKContainer?, Error?) -> Void) in
let modifyOp = CKModifyRecordsOperation(recordsToSave:
                        [record2S!, share], recordIDsToDelete: nil)
modifyOp.savePolicy = .allKeys
modifyOp.modifyRecordsCompletionBlock = { (record, recordID,
                        error) in
                        handler(share, CKContainer.default(), error)
                    }
                    CKContainer.default().privateCloudDatabase.add(modifyOp)
                })
sharingController.availablePermissions = [.allowReadWrite,
                                                          .allowPrivate]
sharingController.delegate = self
                sharingController.popoverPresentationController?.sourceView = self.view
            DispatchQueue.main.async {
                self.present(sharingController, animated:true, completion:nil)
            }

这提供了一个活动控制器,您可以在其中选择说电子邮件,然后发送链接。您可能还想观看此视频,从一开始就关注 cloudKit JS。

也观看这个 WWDC 视频https://developer.apple.com/videos/play/wwdc2015/710/ 它讨论了 cloudkit JSON API,使用它您可以在终端窗口中查询已共享和未共享的内容/也许是简单的脚本。几年前我在使用 Dropbox API 时也是这样做的。嘿,您甚至可以在代码中使用 cloudkit JSON API 来代替本机调用。

于 2018-06-13T11:48:15.477 回答
1

如果您使用的是 a SceneDelegate,请在此处实现委托回调,而不是 on AppDelegate

func windowScene(_ windowScene: UIWindowScene, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
    // ...
}
于 2020-06-09T17:24:19.603 回答
1

如果您的应用程序是在任何版本的 macOS Catalina 上运行的 Mac Catalyst 应用程序,至少包括 10.15.4 Beta 1,则永远不会调用 UIApplicationDelegate userDidAcceptCloudKitShareWith 方法。

经过一些重要的调试后,我们发现 MacCatalyst UIKit 在其 UIApplication 委托中甚至没有 userDidAcceptCloudKitShareWithMetadata 的实现。它没有坏,只是不在那里。因此,至少暂时,我们的解决方法如下,它似乎有效,即使它非常不雅:

// Add CloudKit sharing acceptance handling to UINSApplicationDelegate, which is missing it.
#if targetEnvironment(macCatalyst)
extension NSObject {
    @objc func application(_ application: NSObject, userDidAcceptCloudKitShareWithMetadata cloudKitShareMetadata: CKShare.Metadata) {
        YourClass.acceptCloudKitShare(cloudKitShareMetadata: cloudKitShareMetadata)
    }
}
#endif
于 2020-02-14T18:55:32.647 回答
0

我终于让它工作了!我做了以下所有事情:

  1. 删除了我的应用~/Library/Developer/Excode/DerivedData
  2. 确保我的机器上没有存档我的应​​用程序的其他副本。
  3. 说了一句祷告。
  4. 重新启动。

天哪,这太粗糙了。:)

于 2018-06-13T19:19:28.000 回答