3

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

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

4

1 回答 1

3

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

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

2)我按照您的建议设置了CKDatabaseSubscription共享数据库。

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

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

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

于 2019-03-27T21:32:20.517 回答