【问题标题】:How to create a share with CloudKit's CKShare?如何使用 CloudKit 的 CKShare 创建共享?
【发布时间】:2017-03-23 16:36:26
【问题描述】:

我正在研究 Apple 今年发布的新 CKShare,对此我有一些疑问。我试图关注 WWDC 的“CloudKit 中的新功能”视频,但部分代码在 Xcode 中不再有效。

我要做的是:用户将输入他的姓名和电话,然后单击UIButton,将与特定的人共享。代码如下:

class ViewController: UIViewController, UICloudSharingControllerDelegate {
    @IBOutlet weak var nome: UITextField!
    @IBOutlet weak var telefone: UITextField!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func send(_ sender: AnyObject) {
        print("Send button was clicked.\n")

        let elder = CKRecord(recordType: "Elder")
        elder["name"] = self.name.text as CKRecordValue?
        elder["telephone"] = self.telephone.text as CKRecordValue?

        let ckContainer = CKContainer.default()
        let shareRecord = CKShare(rootRecord: elder)

        shareRecord[CKShareTitleKey] = "Elder" as CKRecordValue?

        let shareController = UICloudSharingController(share: shareRecord, container: ckContainer)
        shareController.delegate = self
        shareController.availablePermissions = [.allowReadOnly]
        shareController.popoverPresentationController?.sourceView = self.button

        self.present(shareController, animated: true)
    }

    func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) {
        print("PROBLEM SAVING SHARE")
    }

    func cloudSharingControllerDidSaveShare(_ csc: UICloudSharingController) {
        print("SHARE SAVED")
    }

    func itemTitle(for csc: UICloudSharingController) -> String? {
        return "a"   //don't know what this is for
    }
}

即使出现 CloudSharingController,我的应用程序仍会继续打印“PROBLEM SAVING SHARE”。此外,CKRecord elder 没有出现在 CloudKit 的仪表板中。

【问题讨论】:

  • print("PROBLEM SAVING SHARE") 更新为print("PROBLEM SAVING SHARE: \(error)"),这样您就知道它失败的原因了。
  • 是的,我在这里发帖后就这样做了……但无论如何,错误是:An added share is being saved without its rootRecord (<CKRecordID: (-big cloudkit stuff-):(_defaultZone:__defaultOwner__)>)。基本上我不是在创建根记录,但是我不明白,根记录是elder,它就在它的正上方!
  • 我应该在尝试创建共享之前保存记录吗?

标签: ios swift share cloudkit


【解决方案1】:

所以,我知道出了什么问题...我使用的是云套件为您创建的默认区域,而您在使用 CKShare 时不能这样做。 您所要做的就是创建一个私有的自定义 CKZone 并将 CKRecord 和 CKShare 保存在其中!

【讨论】:

  • 默认区域不支持共享自定义区域。
  • 是的,为了共享,项目(CKRecord)必须存储在自定义私有区域中。但这不是您的唯一问题。也许这有帮助:stackoverflow.com/a/60683437/3143890
【解决方案2】:

有人告诉我,只有在已创建共享时才能使用您选择使用的初始化程序。对于新共享,使用备用初始化

试试这个代码:

let csc = UICloudSharingController { controller,
        preparationCompletionHandler in
        let share = CKShare(rootRecord: elder)

        let mro = CKModifyRecordsOperation(
            recordsToSave: [elder, share],
            recordIDsToDelete: nil)


        mro.modifyRecordsCompletionBlock = {
            records, recordIDs, error in
            if error != nil {
                    //handle error
            }
            preparationCompletionHandler(share,CKContainer.default(), error)
        }
        myDB.add(mro)
    }

    csc.delegate = self
    self.present(csc, animated:true, completion:nil)

【讨论】:

  • 嘿!我尝试了您的代码,但在mro.modifyRecordsCompletionBlock 中出现错误。我打印了错误,只说这个:Optional("Failed to modify some records") 并且,我认为,因此我无法立即创建共享原因,之后我收到“问题保存共享”消息错误......
  • 我还创建了一个闭包,以确保首先创建记录然后调用 CKShare 方法,但即使这似乎也不起作用......
  • CloudSharingController 显示没有问题,但是当我单击任何按钮进行共享时会发生此错误,例如“复制链接”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2016-08-20
  • 2013-07-04
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
相关资源
最近更新 更多