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

CloudKit CKShare用户DidAcceptCloudKitShareWith从不在Mac应用程序上激发

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

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

    • 创建 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 代表?我一辈子都不知道该怎么办。提前谢谢!

    更新

    我在这方面又试了一些东西。当我在web浏览器中打开共享链接时,我看到:

    enter image description here

    点击 好 啊 使屏幕淡出:

    Nothing

    不是特别有用。:)完成此操作后,参与者在CloudKit中的状态仍为 邀请 ,所以这个份额还没有被接受。

    当我单击消息中的共享链接时,将显示如下弹出窗口: CloudKit Sharing Popup 我单击“打开”后,一个新的应用程序副本显示在dock中,然后应用程序突然关闭。崩溃日志声明:

    由于意外异常“CKException”而终止应用程序,原因:“应用程序缺少必需的权限com.apple.developer.icloud services”

    我试过在Xcode的“功能”部分关闭和打开iCloud,但没有任何改变。我知道这个异常不可能是正确的,因为我可以正常启动我的应用程序并整天使用CloudKit。只有 CKShare公司 导致这次坠机。

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   user3069232    8 年前

    对,

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

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

    **编辑的答案**

    我用这段代码来分享,我不是手动的。。。不确定这是否是OSX下的一个选项,我必须承认。我在用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来代替本机调用。

        2
  •  0
  •   Clifton Labrum    8 年前

    我终于成功了!我做了以下所有的事情:

    1. 已从中删除我的应用 ~/Library/Developer/Excode/DerivedData
    2. 确保我的应用程序没有其他副本存档在我的机器上的任何地方。
    3. 祈祷说。
    4. 重新启动。

    希希,那很粗糙。:)

    推荐文章