CloudKit共享

时间:2016-11-15 06:45:41

标签: ios cloudkit

我无法理解一些CloudKit共享概念和WWDC 2016" CloudKit中的新功能"视频似乎并不能解释允许用户共享和访问共享记录所需的所有内容。

我已经成功创建了一个应用程序,允许用户在其私有数据库中创建和编辑记录。 我还能够创建共享记录并使用提供的共享UIController进行共享。这可以被参与者用户成功接收和接受,但我无法弄清楚如何查询和显示此共享记录。

该应用创建了一个" MainZone"在用户私有数据库中,然后在此" MainZone"中创建一个CKRecord。然后我创建并保存CKShare记录并使用它来显示UICloudSharingController。

如何查询sharedDatabase以访问此记录?我尝试使用privateDatabase中使用的相同查询,但得到以下错误:

"ShareDB can't be used to access local zone"

修改

我发现了问题 - 我需要处理AppDelegate中接受的记录。现在它们出现在CloudKit仪表板中,但我仍然无法查询它们。看来我可能需要获取sharedDatabase" MainZone"为了查询它们。

2 个答案:

答案 0 :(得分:2)

老兄,我明白了:首先你需要获得该共享记录的 CKRecordZone 。您可以通过执行以下操作来完成此操作:

let sharedData = CKContainer.default().sharedCloudDatabase
    sharedData.fetchAllRecordZones { (recordZone, error) in
        if error != nil {
            print(error?.localizedDescription)
        }
        if let recordZones = recordZone {
            // Here you'll have an array of CKRecordZone that is in your SharedDB!
        }
    }

现在,有了这个数组,你所要做的就是正常获取:

func showData(id: CKRecordZoneID) {

    ctUsers = [CKRecord]()

    let sharedData = CKContainer.default().sharedCloudDatabase
    let predicate = NSPredicate(format: "TRUEPREDICATE")
    let query = CKQuery(recordType: "Elder", predicate: predicate)

    sharedData.perform(query, inZoneWith: id) { results, error in
        if let error = error {
            DispatchQueue.main.async {
                print("Cloud Query Error - Fetch Establishments: \(error)")
            }
            return
        }
        if let users = results {
            print(results)
            self.ctUsers = users
            print("\nHow many shares in cloud: \(self.ctUsers.count)\n")
            if self.ctUsers.count != 0 {
                // Here you'll your Shared CKRecords!
            }
            else {
                print("No shares in SharedDB\n")
            }
        }
    }
}

答案 1 :(得分:0)

我不太了解 你希望获得这些信息。我和你有同样的问题,但我只能通过点击URL来获取共享数据......要做到这一点,你需要两个功能。 AppDelegate 中的第一个:

func application(_ application: UIApplication, userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShareMetadata) {

    let acceptSharesOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
    acceptSharesOperation.perShareCompletionBlock = {
        metadata, share, error in
        if error != nil {
            print(error?.localizedDescription)
        } else {
            let viewController: ViewController = self.window?.rootViewController as! ViewController
            viewController.fetchShare(cloudKitShareMetadata)
        }
    }
    CKContainer(identifier: cloudKitShareMetadata.containerIdentifier).add(acceptSharesOperation)
}
ViewConroller 中,您将获得将获取此MetaData的函数:

func fetchShare(_ metadata: CKShareMetadata) {
    let operation = CKFetchRecordsOperation(recordIDs: [metadata.rootRecordID])
    operation.perRecordCompletionBlock = { record, _, error in
        if error != nil {
            print(error?.localizedDescription)
        }
        if record != nil {
            DispatchQueue.main.async() {
                self.currentRecord = record
                //now you have your Shared Record
            }
        }
    }
    operation.fetchRecordsCompletionBlock = { _, error in
        if error != nil {
            print(error?.localizedDescription)
        }
    }
    CKContainer.default().sharedCloudDatabase.add(operation)
}

正如我之前所说,我现在正试图在不访问URL的情况下获取ShareDB。我已经接受了分享后,我不想依赖链接。希望这能帮到你!