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

时间:2018-10-12 23:35:46

标签: cloudkit cloudkit-sharing

假设某个唱片的所有者与我分享了该唱片。我收到一个共享链接,然后打开它并接受这样的共享:

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 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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