2015-06-29 14 views
6

EDIT: Ritestato oggi 27.08.2015 e funziona di nuovo, Apple l'ha riparato.CloudKit notifiche push sull'aggiornamento del record smesso di funzionare

Ho un'applicazione in modalità sviluppo. L'applicazione utilizza CKSubscription per ricevere notifiche sulle modifiche sul server, configurate per tutte e tre le opzioni: creazione, aggiornamento, eliminazione. Tutto stava funzionando bene ma recentemente durante i test di regressione ho scoperto che l'applicazione non riceve notifiche sugli aggiornamenti dei record, le notifiche di creazione e cancellazione continuano a funzionare. I tipi di susbcription sono impostati correttamente per tutte e tre le opzioni come ho controllato sul dashboard e l'applicazione è registrata per CKSubscription come lo era un paio di giorni fa quando funzionava come charm. Non ricevo errori da CloudKit. Il ripristino dell'ambiente di sviluppo non ha aiutato. Ho riproposto la versione con cui sono sicuro che funzionava e ho ottenuto gli stessi risultati.

Qualche idea su cosa potrebbe causare questo problema, cos'altro dovrei controllare/provare?

Ulteriori informazioni: Immagino che qualcosa potrebbe andare storto sul lato server. Non ho cambiato nulla nel codice in cui mi sto iscrivendo agli eventi CloudKit e gestisco le notifiche push - comunque anche la versione in cui funziona non riceve più le notifiche degli aggiornamenti. Viene pubblicata l'applicazione a cui sto lavorando, quindi non è possibile cambiare contenitore. Non so se questo potrebbe causare il problema, voglio solo menzionare: l'app utilizza lo stesso contenitore per la memorizzazione dei Core Data nel cloud: l'obiettivo dell'upgrade dell'app è quello di migrare i dati su CloudKit e utilizzarli come cloud stoccaggio esclusivamente. E 'confusione che tutto stava funzionando benissimo per le settimane e improvvisamente smesso di funzionare senza una ragione chiara, probabilmente come l'effetto del carico da test intensivi, l'aggiunta di tipi di record ...

di prova con applicazione sviluppata da zero: Ho scritto una semplice app di test per controllare le notifiche di ricezione. Posso ricevere solo la notifica sulla creazione di record. Cosa c'è di sbagliato con il mio codice:

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) {} 

}

+0

lo stesso problema: http://stackoverflow.com/q/31103522/1646157 –

+0

La mia soluzione alternativa è invece di utilizzare gli abbonamenti. Scarico tutti i record che sono stati modificati dall'ultimo controllo. Inoltre, in ogni minuto, anche il sondaggio ha modificato i record. 'NSPredicate (formato:" modifyDate>% @ ", lastUpdate)' –

+0

cosa ne pensi della mia altra soluzione alternativa? http://stackoverflow.com/questions/31499029/alternatives-to-up-ate-notification-that-does-not-work –

risposta

1

ho sperimentato questo comportamento in passato. Nel mio caso, potrei risolverlo semplicemente eliminando l'abbonamento e creando di nuovo. Dovresti farlo dal codice e non dalla dashboard. Lo fa dal dashboard funziona solo per l'account a cui accedi al dashboard.

+0

thx per suggerimento, l'ho fatto più volte ma non ho aiutato –

+0

come hai eliminato l'abbonamento - tramite il dashboard di Cloudkit? –

+0

ha provato a eliminare sia a livello di codice che in dashboard senza fortuna. –