编辑: 今天(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) {}
}
NSPredicate(format: "modificationDate > %@", lastUpdate)
- János