我有一个应用程序,可以在其中创建并与其他用户共享记录。当我共享记录并被用户接受时,可以在调用userDidAcceptCloudKitShareWith
之后立即显示共享的对象,并使用CKFetchRecordsOperation
类来获取对象,这里没有问题。我的问题是,用户接受记录,关闭应用程序,然后再次重新打开应用程序后,尝试直接从Shared Database
中读取共享记录。
以下代码成功地从位于名为Private Database
的区域中的ListsZone
读取了所有记录。
@IBAction func sharedRecords(_ sender: Any) {
let privateDatabase = CKContainer.init(identifier: "iCloud.com.mySite.lists").database(with: .private)
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Items", predicate: predicate)
let ckRecordZoneID = CKRecordZone(zoneName: "ListsZone")
let ckRecordID = CKRecord.ID(zoneID: ckRecordZoneID.zoneID)
privateDatabase.perform(query, inZoneWith:ckRecordID.zoneID){( results , error) in
guard error == nil else{
print("Error \(String(describing: error?.localizedDescription))")
return
}
if let itemsFromResults = results{
print("Items: \(itemsFromResults)")
}
}
}
我期望的是能够使用与上面相同的代码从Shared Database
中读取共享记录,除了修改下面的行,但它不起作用。
let privateDatabase = CKContainer.init(identifier: "iCloud.com.mySite.lists").database(with: .shared)
我收到以下错误。
“只能在共享数据库中访问共享区域”
我想念什么?
从Shared Database
读取记录的正确方法是什么?
[给我的印象是,已经接受了来自用户的共享记录并将记录保存在Shared Database
中的用户可以通过直接要求Shared Database
来访问记录,如我上面的代码所示。
FYI-我知道共享数据库中有共享记录,因为我可以在CloudKit仪表板中看到它们。
显然,CustomZone
记录的名称在添加到共享数据库时会更改,因此,您首先需要从共享数据库中检索所有自定义区域。
由于以下两个线程,我找到了答案。
Unable to fetch records in a sharedCloudDatabase custom Zone using CloudKit
@IBAction func readSharedRecords(_ sender: Any) {
let sharedData = CKContainer.default().sharedCloudDatabase
sharedData.fetchAllRecordZones { (recordZone, error) in
if error != nil {
print(error?.localizedDescription ?? "Error")
}
if let recordZones = recordZone {
for i in 0..<recordZones.count{
// find the zone you want to query
if recordZones[i].zoneID.zoneName == "ListsZone"{
self.sharedRecords(zID: recordZones[i].zoneID)
}
}
}
}
}
func sharedRecords(zID: CKRecordZone.ID){
let privateDatabase = CKContainer.init(identifier: "iCloud.com.mySite.lists").database(with: .shared)
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Items", predicate: predicate)
privateDatabase.perform(query, inZoneWith: zID){( results , error) in
guard error == nil else{
print("Error: \(String(describing: error?.localizedDescription))")
return
}
if let itemsFromResults = results{
print("Items: \(itemsFromResults)")
}
}
}