如果所有者在 CloudKit 上将我从 CKShare 中删除,如何收到通知
How to Be Notified if the Owner Removes Me from a CKShare on CloudKit
假设记录的所有者与我分享了它。我收到了一份分享 link,我打开它并接受这样的分享:
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。
据我所知,我收到的仅通知是另一个共享数据库订阅(subscriptionSharedDatabase
)更改,但没有记录被更改或删除(我看了看,当我获取它们时没有更改的记录)。
据我所知,要收到 CKShare
参与者更改通知的唯一方法是订阅 cloudkit.share
记录类型的通知,但这不可用在共享数据库中给我,对吗?
当我从 CKShare
中删除时,如何通知我?
有趣的是,这怎么没有答案。我刚刚实现了一些与 CKShare 相关的代码,它似乎可以正常工作。这是基本方法。
1) 在我的应用程序开始时,我在共享数据库上执行 CKFetchRecordZonesOperation.fetchAllRecordZonesOperation()
,以获取与我共享的所有当前记录区域。
2) 我按照您的建议在共享数据库上设置了 CKDatabaseSubscription
。
3) 在共享数据库上收到此通知后,我对所有共享记录区域进行了批处理 CKFetchRecordZoneChangesOperation
。 (您可以将多个记录区域以及每个区域的服务器更改令牌传递给它,以执行批量更新查询。)
4) 如果任何共享未共享但记录区域本身仍然有效,我观察到 recordWithIDWasDeletedBlock
是 运行 两次,一次是未共享的 CKRecord
,一次是相关 CKShare
.
5)(我还没有完全弄清楚这部分)如果共享是给定用户的最后一个共享,则该用户的整个共享记录区域将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这部分。每次获得 CKDatabaseNotification
时,我都可以查询新的记录区域,但这似乎很浪费。我看到我可以 运行 CKFetchDatabaseChanges
通知我更改区域的操作,但我还没有弄清楚什么时候是 运行 它的最佳时间。
假设记录的所有者与我分享了它。我收到了一份分享 link,我打开它并接受这样的分享:
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。
据我所知,我收到的仅通知是另一个共享数据库订阅(subscriptionSharedDatabase
)更改,但没有记录被更改或删除(我看了看,当我获取它们时没有更改的记录)。
据我所知,要收到 CKShare
参与者更改通知的唯一方法是订阅 cloudkit.share
记录类型的通知,但这不可用在共享数据库中给我,对吗?
当我从 CKShare
中删除时,如何通知我?
有趣的是,这怎么没有答案。我刚刚实现了一些与 CKShare 相关的代码,它似乎可以正常工作。这是基本方法。
1) 在我的应用程序开始时,我在共享数据库上执行 CKFetchRecordZonesOperation.fetchAllRecordZonesOperation()
,以获取与我共享的所有当前记录区域。
2) 我按照您的建议在共享数据库上设置了 CKDatabaseSubscription
。
3) 在共享数据库上收到此通知后,我对所有共享记录区域进行了批处理 CKFetchRecordZoneChangesOperation
。 (您可以将多个记录区域以及每个区域的服务器更改令牌传递给它,以执行批量更新查询。)
4) 如果任何共享未共享但记录区域本身仍然有效,我观察到 recordWithIDWasDeletedBlock
是 运行 两次,一次是未共享的 CKRecord
,一次是相关 CKShare
.
5)(我还没有完全弄清楚这部分)如果共享是给定用户的最后一个共享,则该用户的整个共享记录区域将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这部分。每次获得 CKDatabaseNotification
时,我都可以查询新的记录区域,但这似乎很浪费。我看到我可以 运行 CKFetchDatabaseChanges
通知我更改区域的操作,但我还没有弄清楚什么时候是 运行 它的最佳时间。