Notificaciones push de CloudKit didReceiveRemoteNotification nunca invocadas

Estoy usando CloudKit para almacenar datos de usuario y quiero recibir notifications push cuando se cambian los loggings o se crean nuevos loggings. Pero no funciona…

Me logging para las suscripciones como esta:

- (void) updateCloudSubscriptions { NSPnetworkingicate *allPnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"TRUEPREDICATE"]; CKSubscription *newOrUpdateSubscription = [[CKSubscription alloc] initWithRecordType:kMyRecordType pnetworkingicate:allPnetworkingicate options: (CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate)]; CKNotificationInfo *newOrUpdateNotificationInfo = [CKNotificationInfo new]; newOrUpdateNotificationInfo.shouldBadge = NO; newOrUpdateNotificationInfo.shouldSendContentAvailable = YES; newOrUpdateSubscription.notificationInfo = newOrUpdateNotificationInfo; CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:kMyContainerID] publicCloudDatabase]; [publicDatabase saveSubscription:newOrUpdateSubscription completionHandler:^(CKSubscription *theSubscription, NSError *saveError) { if (saveError){ //error handling } NSLog(@"Subscription created"); }]; } 

Esto tiene éxito. En CloudKit Dashboard, la suscripción se crea correctamente .

En mi AppDelegate ahora tengo lo siguiente:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes: (UIUserNotificationTypeNone | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:notificationSettings]; [application registerForRemoteNotifications]; } 

y estos methods delegates implementados:

 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"%@ with token = %@", NSStringFromSelector(_cmd), deviceToken); } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"%@ with error = %@", NSStringFromSelector(_cmd), error); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"%@", NSStringFromSelector(_cmd)); } 

didRegisterForRemoteNotificationsWithDeviceToken se llama con éxito con un token. Pero didReceiveRemoteNotification nunca se llama.

Probé esto cambiando valores en la versión Mac de mi aplicación y en la versión para iPhone. Ambos cargan los cambios pero ninguno desencadena una notificación. También intenté cambiar los valores directamente en el tablero, pero eso tampoco generó notifications.

¿Que me estoy perdiendo aqui?

Si es relevante: estoy en OS X 10.10 con XCode 6.4

apsd logging apsd pero solo apsd posts como este:

 Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Saving database. Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Destroying database. Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Closed database. Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Reopening database Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Initializing database on thread: <NSThread: 0x7f8f1bf80dd0>{number = 55, name = (null)} Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling auto vacuum. Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling WAL journal mode. Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling Foreign Key support. 

Su logging de notificación es correcto para iOS 8, pero en OS X debe usar registerForRemoteNotificationTypes: método de NSApplication y en iOS 7 el registerForRemoteNotificationTypes: UIApplication registerForRemoteNotificationTypes: método de UIApplication . Documentación :

Una aplicación debe registrarse con el service de notificación push de Apple (APN) para recibir notifications remotas enviadas por el proveedor de push de la aplicación. En iOS 8 y versiones posteriores, el logging tiene cuatro etapas:

  1. Registre los types de notifications que admite su aplicación mediante registerUserNotificationSettings :.
  2. Regístrese para recibir notifications push a través de APN llamando al método registerForRemoteNotifications de su aplicación.
  3. Almacene el token del dispositivo devuelto al delegado de la aplicación por el server para un logging exitoso, o maneje la falla de logging con gracia.
  4. Reenvíe el token del dispositivo al proveedor de inserción de la aplicación.

(En iOS 7, en lugar de los dos primeros pasos, se registra llamando al método registerForRemoteNotificationTypes: de UIApplication y en OS X llamando al método registerForRemoteNotificationTypes: method of NSApplication).

También implementa didReceiveRemoteNotification:fetchCompletionHandler: lugar de didReceiveRemoteNotification :

Use este método para procesar notifications remotas entrantes para su aplicación. A diferencia de la aplicación: didReceiveRemoteNotification: método, que se llama solo cuando su aplicación se ejecuta en primer plano, el sistema llama a este método cuando su aplicación se ejecuta en primer plano o en segundo plano. Además, si habilitaste el modo de background de las notifications remotas, el sistema iniciará tu aplicación (o la despierta del estado suspendido) y la pondrá en estado de background cuando llegue una notificación remota. Sin embargo, el sistema no inicia automáticamente su aplicación si el usuario lo ha forzado. En esa situación, el usuario debe reiniciar su aplicación o reiniciar el dispositivo antes de que el sistema intente ejecutar su aplicación nuevamente.

Si desea que las notifications Info.plist su aplicación, asegúrese de editar Info.plist y marque las Info.plist verificación "Activar modos de background" y "Notificaciones remotas":

introduzca la descripción de la imagen aquí

Dado que desea una notificación silenciosa, según la documentation, solo debe enviar el indicador "contenido disponible" a 1, por lo que es correcto. Pero hay otros usuarios que tuvieron problemas con las notifications silenciosas y, al parecer, enviar la propiedad "sonido" como una cadena vacía ayudó ( vea esta pregunta ), por lo que podría intentar establecer CKNotificationInfo.soundName en una cadena vacía.

El video WWDC CloudKit Tips & Tricks de 2015 señaló que si desea enviar una notificación push silenciosa, debe establecer el valor shouldSendContentAvailable para true en su dictionary notificationInfo, así:

 let notificationInfo = CKNotificationInfo() notificationInfo.shouldSendContentAvailable = true subscription.notificationInfo = notificationInfo