假设一张唱片的主人和我分享。我收到一个共享链接,我打开它并接受这样的共享:
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中移除时,如何通知我
发布于 2019-03-27 21:32:20
有趣的是,这没有答案。我刚刚实现了一些与CKShare相关的代码,它似乎运行得相当好。以下是基本的方法。
1)在我的应用程序开始时,我在共享数据库上做CKFetchRecordZonesOperation.fetchAllRecordZonesOperation(),以获取与我共享的所有当前记录区域。
2)我按照您的建议在共享数据库上设置了CKDatabaseSubscription。
3)在共享数据库上收到此通知后,我将对所有共享记录区域执行批处理CKFetchRecordZoneChangesOperation。(您可以传递多个记录区域,以及每个区域的服务器更改令牌,以执行批量更新查询。)
4)如果任何共享未共享,但记录区域本身仍然有效,我观察到recordWithIDWasDeletedBlock运行了两次,一次是使用未共享的CKRecord,一次是使用相关的CKShare。
5) (我还没有完全弄清楚这一部分),如果该共享是给定用户的最后一个共享,则该用户的整个共享记录区域将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这个部分。每次获得CKDatabaseNotification时,我都可以查询新的记录区域,但这似乎很浪费。我看到我可以运行CKFetchDatabaseChanges操作,它通知我更改的区域,但我还没有弄清楚什么时候是运行它的最佳时间。
https://stackoverflow.com/questions/52788219
复制相似问题