ios - 使用CKCloud套件共享私有(private)记录

标签 ios swift swift3 cloudkit

我正在使用以下代码尝试创建共享私有(private)记录:

@IBAction func testPress(_ sender: Any) {

    let customZone = CKRecordZone(zoneName: "ShareZone")
    let friendRecord = CKRecord(recordType: "Share", zoneID: customZone.zoneID)
    let rootRecord = CKRecord(recordType: "Root", zoneID: customZone.zoneID)

    model.privateDB.delete(withRecordZoneID: customZone.zoneID) { (nil, error) in
        self.model.privateDB.save(customZone) { (nil, error) in
            print("Custom Zone Error = \(error)")
            self.model.privateDB.save(friendRecord, completionHandler: { (nil, error) in
                self.model.privateDB.save(rootRecord, completionHandler: { (nil, error) in
                    self.shareTest(record: friendRecord, root: rootRecord)
                })
            })
        }
    }
}

func shareTest(record:CKRecord, root:CKRecord) {

    record["Name"] = "Test" as CKRecordValue?
    root["Name"] = "Test" as CKRecordValue?

    let ckContainer = CKContainer.default()
    let shareRecord = CKShare(rootRecord: root, share: record.recordID)

    shareRecord[CKShareTitleKey] = "Name" as CKRecordValue?

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

    self.present(shareController, animated: false)
}

但是,当我按下共享链接的方式时,我返回错误:

CKError 0x6000002535f0: "Invalid Arguments" (12); "An added share is being saved without its rootRecord (CKRecordID: 0x608000224560; recordName=C0ADC819-57F7-4D99-A527-B21590F506AB, zoneID=ShareZone:defaultOwner)"

我查看了 Link 的答案,他也遇到了同样的问题,但不太知道如何让他们的解决方案发挥作用,因为他们没有提供足够的详细信息。

有人知道我做错了什么吗?

最佳答案

我相信错误消息告诉您需要同时保存共享和根记录。

let modifyRecordsOperation = CKModifyRecordsOperation( recordsToSave: [record, share], recordIDsToDelete: nil)

您应该在共享 Controller 的完成处理程序中执行此操作。

sharingController = UICloudSharingController {
                        controller, preparationCompletionHandler in

编辑:您的代码看起来像这样未经测试的代码:

@IBAction func testPress(_ sender: Any) {
    let privatedatabase = CKContainer.default().privateCloudDatabase
    let newZoneName = UUID().uuidString
    let recordZone = CKRecordZone(zoneName: "ShareZone")

    privatedatabase.save(recordZone) {  savedRecordZone, error in

        if let error = error {
            print("\(error.localizedDescription).")
        } else if let savedRecordZone = savedRecordZone {
            print("\(error.localizedDescription).")

            let rootRecord = CKRecord(recordType: "RootRecord", zoneID: savedRecordZone.zoneID)
            rootRecord["Name"] = "Test" as CKRecordValue?

            privatedatabase.save(rootRecord) { record, error in
                if let error = error {
                    print("\(error.localizedDescription).")
                } else if let record = record {
                    print("successfully added rootRecord to cloud.")
                    self.shareTest( rootRecord: record)
                }
            }
        }
    }
}

func shareTest(rootRecord:CKRecord) {

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

    let sharingController =  UICloudSharingController { controller, preparationCompletionHandler in

        let share = CKShare(rootRecord: record)
        share[CKShareTitleKey] = "Share Title" as CKRecordValue
        share.publicPermission = .none

        let modifyRecordsOperation = CKModifyRecordsOperation( recordsToSave: [rootRecord, share], recordIDsToDelete: nil)
        modifyRecordsOperation.timeoutIntervalForRequest = 10
        modifyRecordsOperation.timeoutIntervalForResource = 10

        modifyRecordsOperation.modifyRecordsCompletionBlock = { records, recordIDs, error in

            if let error = error {
                print(error.localizedDescription)
            }
            if let records = records {
                print("Share and Root records saved successfully")
            }
            preparationCompletionHandler(share, CKContainer(identifier: ckContainerID ), error)
        }

        myCloudDatabase.add(modifyRecordsOperation)
    }
    if let sharingController = sharingController {
        sharingController.availablePermissions = [.allowReadOnly, .allowReadWrite, .allowPrivate]
        sharingController.popoverPresentationController?.sourceView = sender
        sharingController.delegate = self
        self.present(sharingController, animated: true)
    }
}

// MARK: UICloudSharingControllerDelegate
// --------------------------------------
func cloudSharingController(_ csc: UICloudSharingController, failedToSaveShareWithError error: Error) {
    print("Failed to share to cloud: \(error)")
}
func itemTitle(for csc: UICloudSharingController) -> String? {
    return "Please join rootRecord share."
}
func cloudSharingControllerDidStopSharing(_ csc: UICloudSharingController) {
    print("Cloudkit stopped sharing")
}
func cloudSharingControllerDidSaveShare(_ csc: UICloudSharingController) {
    print("Cloudkit started sharing rootRecord")
}

关于ios - 使用CKCloud套件共享私有(private)记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42646346/

相关文章:

ios - ActionScript 3 中 iPhone 的垂直滚动

ios - 模态转场,但我需要一个模态礼物

ios - 每次加载应用程序时如何使用照片库 ios 中的照片?

swift - 尝试将 double 从一个 View 传递到另一个 View ,但它不起作用

ios - 两个标签的对齐及其约束

swift - 嵌套通知中的 DispatchGroup [weak self] 处理

ios - scrollView contentOffset y 更改时如何动态更改字体大小?

ios - 段错误 : 11; (xcode 8, Swift 3) 使用 NotificationCenter 后

iphone - iOS - 当设置为 0 时 UICollectionView 间距仍然存在 - 如何设置单元格之间没有间距

ios - 无法理解 iOS 系统 UIPasteboard