假设记录的所有者与我分享。我收到了一个共享链接,我打开它并接受这样的共享:
let operation = CKAcceptSharesOperation(shareMetadatas: [metadata])
operation.acceptSharesCompletionBlock = { error in
if let error = error{
print("accept share error: \(error)")
}else{
//Share accepted...
}
}
CloudKit.container.add(operation)
我之前也订阅了共享数据库,如下所示:
let subscriptionSharedDatabase = CKDatabaseSubscription(subscriptionID: "subscriptionSharedDatabase")
let sharedInfo = CKSubscription.NotificationInfo()
sharedInfo.shouldSendContentAvailable = true
sharedInfo.alertBody = "" //This needs to be set or pushes don't get sent
subscriptionSharedDatabase.notificationInfo = sharedInfo
let subShared = CKModifySubscriptionsOperation(subscriptionsToSave: [subscriptionSharedDatabase], subscriptionIDsToDelete: nil)
CloudKit.sharedDB.add(subShared)
但现在让我们说CKShare
的所有者将我删除为该记录的参与者并将更新的参与者列表保存到CloudKit。
据我所知,我得到的唯一通知是另一个共享数据库订阅(subscriptionSharedDatabase
)更改,但没有更改或删除记录(我查看并且在获取它们时没有更改记录)。
据我所知,获得CKShare
参与者变更通知的唯一方法是订阅cloudkit.share
记录类型的通知,但我在共享数据库中无法使用,对吧?
当我从CKShare
中删除时如何通知我?
有趣的是,这没有答案。我刚刚实现了一些与CKShare相关的代码,它似乎相当可预测。这是基本方法。
1)在我的应用程序开始时,我在共享数据库上执行CKFetchRecordZonesOperation.fetchAllRecordZonesOperation()
,以获取与我共享的所有当前记录区域。
2)我按照你的建议在共享数据库上设置CKDatabaseSubscription
。
3)在共享数据库上收到此通知后,我在所有共享记录区域中执行批处理CKFetchRecordZoneChangesOperation
。 (您可以将多个记录区域与每个区域的服务器更改标记一起传递,以执行批量更新查询。)
4)如果任何股票没有共享但记录区本身仍然有效,我观察到recordWithIDWasDeletedBlock
运行两次,一次使用非共享CKRecord
,一次使用相关的CKShare
。
5)(我还没有完全弄清楚这一部分)如果共享是给定用户的最后一个,那么该用户的整个共享记录区域将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这部分。我每次拿到CKDatabaseNotification
时都可以查询新记录区,但这看起来很浪费。我看到我可以运行CKFetchDatabaseChanges
操作,通知我更改区域,但我还没弄清楚何时是运行它的最佳时间。