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

6

编辑: 今天(2015年8月27日)重新测试,现在已经可以使用了,苹果已经修复了这个问题。

我正在开发一个应用程序。该应用程序使用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) {}

}


一样的问题。两周前更新订阅还能用,现在却停止了。我只能收到记录创建的通知,而不能收到更新的通知。使用Xcode7 beta 1时,代码可以正常运行,但是在使用Xcode7 beta 2后就出现了问题。 - Christian1313
同一个问题:https://dev59.com/Z4zda4cB1Zd3GeqPmnMo - Lubos Ilcik
我的解决方法是,不使用订阅,而是下载自上次检查以来更改的所有记录。此外,每分钟我还会轮询更改的记录。NSPredicate(format: "modificationDate > %@", lastUpdate) - János
你觉得我的另一个解决方法怎么样?http://stackoverflow.com/questions/31499029/alternatives-to-update-notification-that-does-not-work - János
1个回答

1
我曾经遇到过这种情况。在我的情况下,我只需要删除订阅并重新创建即可解决问题。您应该从代码中执行此操作,而不是从仪表板中执行。从仪表板执行只适用于您登录的帐户。

你是如何通过Cloudkit仪表板删除订阅的? - UKDataGeek
尝试通过编程和仪表板删除两者,但都没有成功。 - UKDataGeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接