使用 CKShare 订阅

Posted

技术标签:

【中文标题】使用 CKShare 订阅【英文标题】:Subscriptions with CKShare 【发布时间】:2018-01-30 07:50:09 【问题描述】:

我是订阅和 Cloudkit 的新手,我正在尝试设置订阅,以便在创建、编辑、删除 CKShare 记录以及参与者离开私有和共享数据库的共享时发送推送通知。

在我的应用程序中,Cloudkit 中有两种记录类型。第一个是Deck,第二个是CardDeckCardone-to-many 关系。每个Card 拥有一个CKReference 到它的Deck。我注意到 Cloudkit 仪表板中有第三个记录类型,名为 cloudkit.share。根据我的研究,我相信我在这里需要四个订阅。当用户使用CKDatabaseSubscription 接受共享时,每个DeckCard 在私有数据库上使用CKQuerySubscription,在共享数据库上每个DeckCard。我是否还需要在每个数据库上为记录类型cloudkit.share 创建另一个订阅,总共六个订阅?

谢谢

【问题讨论】:

为私有和共享数据库创建 CKDatabaseSubscription。这样,对您的私有或共享数据库所做的任何更改都将作为通知发送。这包括添加/删除/更新记录/共享。有一些关于这方面的 WWDC 视频,请观看。 您的评论确实有助于处理从获取更改的记录返回的 cloudkit.share 记录。当我获取更改的记录时,为什么我会得到一个返回。 【参考方案1】:

在共享和私有数据库上都设置了一个CKDatabaseSubscription 后,任何更改都会触发 AppDelegate 方法:

-(void)application:(NSApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary<NSString *,id> *)userInfo

共享数据库有点复杂,因为您无法查询默认区域。您需要使用setRecordZoneWithIDChangedBlock:^(CKRecordZoneID * _Nonnull zoneID) 设置初始CKFetchDatabaseChangesOperation 以获取共享记录zoneID。有了它,您可以像私有数据库一样查询所有共享记录。

不要忘记在测试时从 CloudKitDashboard 中删除订阅,因为订阅将保留并触发,即使从您的代码中删除也是如此。

【讨论】:

以上是关于使用 CKShare 订阅的主要内容,如果未能解决你的问题,请参考以下文章

无法共享 CloudKit CKShare 记录

如何删除CKShare?

在 CKModifyRecordsOperation 中保存 CKRecord 和 CKShare 时出错

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

CloudKit CKShare URL 无处可去

从共享记录中删除自己