通过 CKSubscription 观察 CKRecord 删除不起作用

Posted

技术标签:

【中文标题】通过 CKSubscription 观察 CKRecord 删除不起作用【英文标题】:Observe CKRecord deletion via CKSubscription does not work 【发布时间】:2014-09-13 09:56:58 【问题描述】:

CKSubscription 文档说:当记录修改导致订阅触发时,服务器将推送通知发送到所有具有该订阅的设备除了进行原始更改的设备到记录。

假设我有两个设备:device 1device 2 从不同的 iCloud 帐户登录。假设两个设备都订阅了某个记录类型的记录删除。

    如果device 1 创建了一条记录,然后device 1 将其删除,那么device 2 会收到通知 - 根据文档,但是.. 如果device 1 创建了一条记录,然后device 2 将其删除,那么device 2 会收到通知 - 我不认为这是根据文档,它没有任何意义,device 2 已删除所以应该通知device 1

在设备 1 和设备 2 上设置订阅

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))
    application.registerForRemoteNotifications()

    let defaultContainer = CKContainer.defaultContainer()
    let publicDatabase = defaultContainer.publicCloudDatabase

    publicDatabase.fetchAllSubscriptionsWithCompletionHandler(subscriptions, error in

        if error == nil 

            if subscriptions.count == 0 

                let subscription = CKSubscription(recordType: "OU", predicate: NSPredicate(value: true), options: .FiresOnRecordDeletion)
                subscription.notificationInfo = CKNotificationInfo()
                subscription.notificationInfo.shouldBadge = false
                subscription.notificationInfo.alertBody = "OU removed or upated"
                publicDatabase.saveSubscription(subscription, completionHandler: subscription, error in
                    if error == nil 
                     else 
                        println("\(error.localizedDescription)")
                    
                )
            

         else 
            println("\(error.localizedDescription)")
        
    )


    return true


在设备 1 上创建记录

@IBAction func addOU(sender: AnyObject) 

    var defaultContainer = CKContainer.defaultContainer()
    var publicDatabase = defaultContainer.publicCloudDatabase

    let r = CKRecord(recordType: "OU", recordID: CKRecordID(recordName: "aaaa"))
    publicDatabase.saveRecord(r, completionHandler:  r2, error in

        if error == nil 
         else 
            println("\(error.localizedDescription)")
        
    )


删除设备 2 上的记录

@IBAction func removeOU(sender: AnyObject) 

    var defaultContainer = CKContainer.defaultContainer()
    var publicDatabase = defaultContainer.publicCloudDatabase

    publicDatabase.deleteRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: recordID, error in

        if error == nil 

         else 
            println("\(error.localizedDescription)")
        
    )

【问题讨论】:

我已经发现了错误 rdar://18810914 【参考方案1】:

我仍然认为 CKSubscription 的工作原理毫无意义,但作为临时修复,我建议先将 CKRecordlastModifiedUserRecordID 更改为想要删除记录的用户,然后再删除记录。

要更改lastModifiedUserRecordID,您必须获取它并且不做任何操作将其保存回来,然后可以删除:

@IBAction func removeOU(sender: AnyObject) 

    var defaultContainer = CKContainer.defaultContainer()
    var publicDatabase = defaultContainer.publicCloudDatabase

    publicDatabase.fetchRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: record, error in

        if error == nil 

            publicDatabase.saveRecord(record, completionHandler: record2, error in

                if error == nil 

                    publicDatabase.deleteRecordWithID(CKRecordID(recordName: "aaaa"), completionHandler: recordID, error in

                        if error == nil 

                         else 
                            println("\(error.localizedDescription)")
                        
                    )
                 else 
                    println("\(error.localizedDescription)")
                
            )

         else 
            println("\(error.localizedDescription)")
        
    )

【讨论】:

天哪... 是否报告了此错误?雷达? 遇到了熟悉的麻烦,您的解决方法帮助了我。在我的情况下是以下问题:设备 1 创建了一条记录并订阅了该记录被删除。设备 2 删除了记录。设备 1 未收到通知。 我也是 rdar://18810914 我已经报告了 3 个关于 CKSubscription 的问题 :-( 这太疯狂了。让我花了 3 周时间对离线同步功能进行故障排除。

以上是关于通过 CKSubscription 观察 CKRecord 删除不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何快速解析 TVos 中返回的 CKSubscription 用户信息字段

CloudKit 修改现有的 CKSubscription

如何使用 CKSubscription 发送多列信息

如何设置最小的 CKSubscription?

具有复杂谓词的 CKSubscription

对 creatorUserRecordID 的 CKSubscription 永远不会到达