使用 CKShare 订阅
Posted
技术标签:
【中文标题】使用 CKShare 订阅【英文标题】:Subscriptions with CKShare 【发布时间】:2018-01-30 07:50:09 【问题描述】:我是订阅和 Cloudkit 的新手,我正在尝试设置订阅,以便在创建、编辑、删除 CKShare 记录以及参与者离开私有和共享数据库的共享时发送推送通知。
在我的应用程序中,Cloudkit 中有两种记录类型。第一个是Deck
,第二个是Card
。 Deck
与 Card
有 one-to-many
关系。每个Card
拥有一个CKReference
到它的Deck
。我注意到 Cloudkit 仪表板中有第三个记录类型,名为 cloudkit.share
。根据我的研究,我相信我在这里需要四个订阅。当用户使用CKDatabaseSubscription
接受共享时,每个Deck
和Card
在私有数据库上使用CKQuerySubscription
,在共享数据库上每个Deck
和Card
。我是否还需要在每个数据库上为记录类型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 订阅的主要内容,如果未能解决你的问题,请参考以下文章
在 CKModifyRecordsOperation 中保存 CKRecord 和 CKShare 时出错