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

问题描述 投票:1回答:1

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

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中删除时如何通知我?

cloudkit cloudkit-sharing
1个回答
1
投票

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

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

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

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

4)如果任何股票没有共享但记录区本身仍然有效,我观察到recordWithIDWasDeletedBlock运行两次,一次使用非共享CKRecord,一次使用相关的CKShare

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

© www.soinside.com 2019 - 2024. All rights reserved.