我正致力于在Swift 4中的一个CKShare应用程序中接受一个macOS。我已经完成了以下所有工作:
CKShare并使用其rootRecord保存到CloudKitCKShare.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浏览器中打开共享链接时,我会看到以下内容:

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

没什么特别的帮助。)这样做后,参与者在CloudKit中的状态仍然是邀请的,因此该份额仍未被接受。
当我单击消息中的共享链接时,会看到如下弹出:

在我点击“打开”之后,我的应用程序的一个新副本就会出现在客户端,然后应用程序就会突然关闭。坠机日志声明:
由于异常“CKException”终止应用程序,原因是:“应用程序缺少必要的权限com.apple.developer.ic头-services”
在Xcode的功能部分,我尝试过一次又一次地关闭iCloud,但是没有什么改变。我知道这个例外是不对的,因为我可以正常启动我的应用程序,并且整天使用CloudKit。只有CKShare才会导致这次崩溃。
这真是一团糟。救救我,欧比万·克诺比,你是我唯一的希望。
发布于 2018-06-13 11:48:15
是,
您需要将其添加到info.plist中。
<key>CKSharingSupported</key>
<true/>**编辑答复**
我用这个代码来分享,我不手动.不确定这是否是OS下的一个选项,我必须承认。我正在使用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,使用它,您可以查询终端窗口/简单脚本中哪些已经共享,哪些没有共享。几年前,我在使用dropbox时也是这样做的。嘿,您甚至可以在代码中使用cloudkit JSON来代替本机调用。
发布于 2018-06-13 19:19:28
我终于开始工作了!我做了以下所有事情:
~/Library/Developer/Excode/DerivedData中删除我的应用程序嘿,那太难了。:)
发布于 2020-02-14 18:55:32
如果您的应用程序是运行在任何版本的macOS Catalina (至少包括10.15.4 Beta 1 )上的Mac催化剂应用程序,则永远不会调用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)
}
}
#endifhttps://stackoverflow.com/questions/50827303
复制相似问题