首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CloudKit共享

CloudKit共享
EN

Stack Overflow用户
提问于 2016-11-15 06:45:40
回答 2查看 2.8K关注 0票数 5

我很难理解一些CloudKit共享概念和2016年“CloudKit中的新内容”视频似乎没有解释允许用户共享和访问共享记录所需的所有内容。

我已经成功地创建了一个应用程序,允许用户在他们的私有数据库中创建和编辑记录。我还能够创建一个共享记录,并使用提供的共享UIController来共享这个记录。这可以被参与者用户成功地接收和接受,但是我不知道如何查询和显示这个共享记录。

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

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

代码语言:javascript
复制
"ShareDB can't be used to access local zone"

编辑

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-19 14:30:47

伙计,我明白了:首先,你需要得到共享记录的CKRecordZone。您可以通过以下操作来做到这一点:

代码语言:javascript
复制
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!
        }
    }

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

代码语言:javascript
复制
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")
            }
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-11-19 13:39:41

想要得到这些信息的时候,我不太理解。我和你有同样的问题,但我只能通过点击URL获得共享数据.要做到这一点,您需要两个函数。AppDelegate中的第一个

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)
}

正如我前面所说的,我现在尝试在不访问ShareDB的情况下获取URL。一旦我已经接受了这个份额,我就不想依赖这个链接了。希望这对你有帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40603657

复制
相关文章

相似问题

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