首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CloudKit CKShare userDidAcceptCloudKitShareWith从不在Mac应用程序上开火

CloudKit CKShare userDidAcceptCloudKitShareWith从不在Mac应用程序上开火
EN

Stack Overflow用户
提问于 2018-06-12 23:44:30
回答 5查看 1.2K关注 0票数 4

我正致力于在Swift 4中的一个CKShare应用程序中接受一个macOS。我已经完成了以下所有工作:

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

当我单击与CKShare相关的共享链接时,它会打开我的应用程序,但是什么都不会发生,userDidAcceptCloudKitShareWith也不会启动。

代码语言:javascript
复制
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浏览器中打开共享链接时,我会看到以下内容:

单击OK会使屏幕淡出如下所示:

没什么特别的帮助。)这样做后,参与者在CloudKit中的状态仍然是邀请的,因此该份额仍未被接受。

当我单击消息中的共享链接时,会看到如下弹出:

在我点击“打开”之后,我的应用程序的一个新副本就会出现在客户端,然后应用程序就会突然关闭。坠机日志声明:

由于异常“CKException”终止应用程序,原因是:“应用程序缺少必要的权限com.apple.developer.ic头-services”

在Xcode的功能部分,我尝试过一次又一次地关闭iCloud,但是没有什么改变。我知道这个例外是不对的,因为我可以正常启动我的应用程序,并且整天使用CloudKit。只有CKShare才会导致这次崩溃。

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

EN

回答 5

Stack Overflow用户

发布于 2018-06-13 11:48:15

是,

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

代码语言:javascript
复制
<key>CKSharingSupported</key>
<true/>

**编辑答复**

我用这个代码来分享,我不手动.不确定这是否是OS下的一个选项,我必须承认。我正在使用iOS。

代码语言:javascript
复制
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,使用它,您可以查询终端窗口/简单脚本中哪些已经共享,哪些没有共享。几年前,我在使用dropbox时也是这样做的。嘿,您甚至可以在代码中使用cloudkit JSON来代替本机调用。

票数 3
EN

Stack Overflow用户

发布于 2018-06-13 19:19:28

我终于开始工作了!我做了以下所有事情:

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

嘿,那太难了。:)

票数 1
EN

Stack Overflow用户

发布于 2020-02-14 18:55:32

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

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

代码语言:javascript
复制
// 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50827303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档