如果所有者从 CloudKit 上的 CKShare 中删除我,如何通知我

Posted

技术标签:

【中文标题】如果所有者从 CloudKit 上的 CKShare 中删除我,如何通知我【英文标题】:How to Be Notified if the Owner Removes Me from a CKShare on CloudKit 【发布时间】:2018-10-12 23:35:45 【问题描述】:

假设记录的所有者与我共享它。我收到了一个分享链接,我打开它并接受这样的分享:

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)

我之前也订阅了 Shared 数据库,如下所示:

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。

据我所知,我收到的 only 通知是另一个共享数据库订阅 (subscriptionSharedDatabase) 更改,但没有更改或删除任何记录(我查看并没有更改记录当我取它们时)。

据我所知,在 CKShare 上收到参与者更改通知的唯一方法是订阅 cloudkit.share 记录类型的通知,但这在共享数据库中对我不可用对吧?

当我从 CKShare 中删除时,如何通知我?

【问题讨论】:

【参考方案1】:

有趣的是,这没有答案。我刚刚实现了一些与 CKShare 相关的代码,它的工作似乎相当可预测。这是基本方法。

1) 在我的应用程序开始时,我在共享数据库上执行CKFetchRecordZonesOperation.fetchAllRecordZonesOperation(),以获取与我共享的所有当前记录区域。

2) 我按照你的建议在共享数据库上设置了CKDatabaseSubscription

3) 在共享数据库上收到此通知后,我在所有共享记录区域中执行批处理CKFetchRecordZoneChangesOperation。 (您可以将多个记录区域与每个区域的服务器更改令牌一起传递给它,以进行批量更新查询。)

4) 如果有任何共享未共享但记录区域本身仍然有效,我观察到recordWithIDWasDeletedBlock 运行了两次,一次与未共享的CKRecord 一起运行,一次与相关的CKShare 运行。

5)(我还没有完全弄清楚这部分)如果共享是给定用户的最后一个共享,则该用户的整个共享记录区域将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这部分。每次收到CKDatabaseNotification 时,我都可以查询新的记录区,但这似乎很浪费。我发现我可以运行CKFetchDatabaseChanges 操作来通知我更改的区域,但我还没有弄清楚什么时候是运行它的最佳时间。

【讨论】:

感谢您的回答,@jaanus。我最终就此与 Apple 技术支持进行了交谈,他们说要知道记录是否已与您取消共享的唯一方法是查看共享记录删除通知。 最近一直在做这个。如果使用 CKFetchDatabaseChangesOperation,请实现 recordZoneWithIDWasDeletedBlock。当共享区域被删除时,将调用这个完成处理程序,您可以删除该区域中的所有缓存记录

以上是关于如果所有者从 CloudKit 上的 CKShare 中删除我,如何通知我的主要内容,如果未能解决你的问题,请参考以下文章

每天从特定记录类型中删除所有记录 CloudKit

从 Cloudkit 获取音乐文件

无法从 Cloudkit Cloud (JS) 检索所有记录

清除/清除 CloudKit 容器的所有用户 iCloud 记录

CloudKit 通知未发送到所有设备

CloudKit 在 App Store 部署后不再工作