记录更新的 CloudKit 推送通知停止工作

Posted

技术标签:

【中文标题】记录更新的 CloudKit 推送通知停止工作【英文标题】:CloudKit push notifications on record update stopped working 【发布时间】:2015-06-29 05:44:55 【问题描述】:

编辑: 今天 27.08.2015 重新测试,它再次工作,Apple 已修复它。

我有一个处于开发模式的应用程序。该应用程序使用 CKSubscription 来获取服务器上更改的通知,并针对所有三个选项进行了配置:创建、更新、删除。一切正常,但最近在回归测试期间,我发现应用程序没有收到有关记录更新的通知,创建和删除通知仍在工作。当我在仪表板上检查时,所有三个选项的订阅类型都已正确设置,并且应用程序已为 CKSubscription 注册,因为它在几天前像魅力一样工作。我没有从 CloudKit 收到任何错误。开发环境的重置没有帮助。我已经使用我确信它可以正常工作并得到相同结果的版本进行了重新测试。

知道可能导致此问题的原因,我还应该检查/尝试什么?

其他信息: 我想服务器端可能会出现问题。我没有更改订阅 CloudKit 事件和处理推送通知的代码中的任何内容 - 无论如何,它正在工作的版本也不再收到更新通知。我正在处理的应用程序已发布,因此无法更改容器。不确定这是否会导致问题,只想提一下:应用程序使用相同的容器将核心数据存储在云中 - 应用程序升级的目标是将数据迁移到 CloudKit 并将其用作云专门存储。令人困惑的是,数周以来一切正常,然后突然停止工作,没有任何明确的原因,可能是由于密集测试负载的影响,添加了记录类型......

使用从头开发的应用进行测试: 我编写了一个简单的测试应用程序来检查接收通知。我只能收到有关记录创建的通知。我的代码有什么问题:

import UIKit
import CloudKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 

var window: UIWindow?

let container = CKContainer.defaultContainer()

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

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

    return true


func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) 
    println("didFailToRegisterForRemoteNotificationsWithError: \(error)")


func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
    println("didRegisterForRemoteNotificationsWithDeviceToken: \(deviceToken)")
    subscribe()


func subscribe() 
//        let predicate = NSPredicate(format: "text != %@", argumentArray: [""])
//        let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)
    let predicate = NSPredicate(value: true)
    let subscription = CKSubscription(recordType: "Note", predicate: predicate, options: .FiresOnRecordDeletion | .FiresOnRecordUpdate | .FiresOnRecordCreation)
    let notificationInfo = CKNotificationInfo()
    notificationInfo.alertBody = ""
    subscription.notificationInfo = notificationInfo
    let publicDatabase = container.publicCloudDatabase
    println("subscribing with CloudKit...")
    publicDatabase.saveSubscription(subscription, completionHandler:  (returnedSubscription, error) -> Void in
        if let error = error 
            println("subscription error \(error.localizedDescription)")
         else 
            println("subscription ok")
        
    )


func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 
    let ckNotification = CKQueryNotification(fromRemoteNotificationDictionary: userInfo)
    println("didReceiveRemoteNotification: \(ckNotification)")


func applicationWillResignActive(application: UIApplication) 

func applicationDidEnterBackground(application: UIApplication) 

func applicationWillEnterForeground(application: UIApplication) 

func applicationDidBecomeActive(application: UIApplication) 

func applicationWillTerminate(application: UIApplication) 

【问题讨论】:

这里也一样。 2 周前更新订阅有效。现在已经停了。我只收到有关创建记录的通知,而不是使用 Xcode7 beta 1 更新代码正在使用它停止的 Xcode7 beta 2。 同样的问题:***.com/q/31103522/1646157 我的解决方法是不使用订阅,而是下载自上次检查以来更改的所有记录。此外,我每分钟都会投票更改记录。 NSPredicate(format: "modificationDate > %@", lastUpdate) 您对我的其他解决方法有何看法? ***.com/questions/31499029/… 【参考方案1】:

我过去曾经历过这种行为。就我而言,我可以通过删除订阅并再次创建它来解决它。您应该通过代码而不是仪表板来执行此操作。从仪表板执行此操作仅适用于您登录到仪表板的帐户。

【讨论】:

您是如何删除订阅的 - 通过 Cloudkit 仪表板? 尝试以编程方式和在仪表板中删除,但没有成功。

以上是关于记录更新的 CloudKit 推送通知停止工作的主要内容,如果未能解决你的问题,请参考以下文章

未收到CloudKit推送通知

开发推送通知突然停止工作,但测试飞行推送通知仍然有效

使用解析的 Android 推送在一段时间后停止工作

iOS:推送通知已停止工作

打包iOS应用程序后推送通知停止工作

打包 iOS 应用后推送通知停止工作