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

Lub*_*cik 6 apple-push-notifications ios cloudkit cksubscription

编辑:今天在2015年8月27日重新测试,它再次运作,苹果已修复它.

我有一个处于开发模式的应用程序.该应用程序使用CKSubscription来获取服务器上的更改通知,为所有三个选项配置:创建,更新,删除.一切都运行正常但最近在回归测试期间我发现应用程序没有收到有关记录更新的通知,创建和删除通知仍然有效.正如我在仪表板上检查的那样,所有三个选项都正确设置了susbcription类型,并且应用程序已注册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) {}
Run Code Online (Sandbox Code Playgroud)

}

Edw*_*eer 1

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