假设某个唱片的所有者与我分享了该唱片。我收到一个共享链接,然后打开它并接受这样的共享:
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
中被删除后,如何通知我?
答案 0 :(得分:1)
有趣的是没有答案。我刚刚实现了一些与CKShare相关的代码,它的工作似乎可以预测。这是基本方法。
1)在我的应用程序启动时,我在共享数据库上执行CKFetchRecordZonesOperation.fetchAllRecordZonesOperation()
,以获取与我共享的所有当前记录区域。
2)我按照您的建议在共享数据库上设置了CKDatabaseSubscription
。
3)在共享数据库上收到此通知后,我在所有共享记录区中进行了批处理CKFetchRecordZoneChangesOperation
。 (您可以将多个记录区域以及每个区域的服务器更改令牌传递给它,以进行批量更新查询。)
4)如果未共享任何份额,但记录区本身仍然有效,我观察到recordWithIDWasDeletedBlock
运行了两次,一次与未共享的CKRecord
一起运行,一次与相关的{{1} }。
5)(我尚未完全弄清楚这部分),如果共享是给定用户的最后一个共享,则该用户的整个共享记录区将从我的共享数据库中删除。我还没有完全弄清楚如何最好地处理这一部分。每当我得到CKShare
时,我都可以查询新的记录区,但这似乎很浪费。我看到我可以运行CKDatabaseNotification
操作,该操作可以通知我已更改的区域,但是我还没有弄清楚何时是运行它的最佳时间。