Перестали работать push-уведомления CloudKit при обновлении записи
РЕДАКТИРОВАТЬ: перепроверено сегодня 27.08.2015, и он снова работает, Apple это исправил.
У меня есть приложение в режиме разработки. Приложение использует CKSubscription для получения уведомлений об изменениях на сервере, настроенных для всех трех параметров: создание, обновление, удаление. Все работало нормально, но недавно во время регрессионных тестов я обнаружил, что приложение не получает уведомлений об обновлениях записей, уведомления о создании и удалении все еще работают. Типы подписки установлены правильно для всех трех опций, как я проверил на приборной панели, и приложение зарегистрировано для CKSubscription, как это было пару дней назад, когда оно работало как чудо. Я не получаю никаких ошибок от CloudKit. Сброс среды разработки не помог. Я перепроверил версию, с которой, я уверен, она работала, и получил те же результаты.
Любая идея, что может быть причиной этой проблемы, что еще я должен проверить / попробовать?
Дополнительная информация: Я думаю, что что-то может пойти не так на стороне сервера. Я ничего не изменил в коде, где я подписываюсь на события CloudKit и обрабатываю push-уведомления - во всяком случае, версия, в которой он работал, больше не получает уведомлений об обновлениях. Приложение, над которым я работаю, опубликовано, поэтому менять контейнер не стоит. Не уверен, что это может быть причиной проблемы, просто хочу упомянуть: приложение использует тот же контейнер для хранения основных данных в облаке - цель обновления приложения - перенести данные в 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) {}
}
1 ответ
Я испытывал это поведение в прошлом. В моем случае я мог решить эту проблему, просто удалив подписку и создав ее заново. Вы должны сделать это из кода, а не из панели инструментов. Выполнение этого с панели управления работает только для той учетной записи, в которую вы вошли.