didReceiveRemoteNotification no funciona en segundo plano

Estoy trabajando en una gran aplicación con un gran fragmento de código heredado. Actualmente, hay una implementación para:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

El problema es que solo se invoca cuando la aplicación está en primer plano O cuando el usuario toca la notificación mientras la aplicación está en segundo plano. Traté de implementar:

 - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 

Pero la aplicación se comporta de la misma manera. En cualquier caso, este método no se llama cuando la aplicación está en segundo plano. ¿Cual podría ser el problema?

Implementando didReceiveRemoteNotification y didReceiveRemoteNotification:fetchCompletionHandler es la forma correcta, pero también debe hacer lo siguiente:

Asegúrese de registrarse para recibir notificaciones remotas, consulte la documentación aquí :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; return YES; } 

También asegúrese de editar Info.plist y marcar las Info.plist verificación “Habilitar modos de fondo” y “Notificaciones remotas”:

enter image description here

Además, debe agregar "content-available":1 a su carga de notificación de inserción, de lo contrario, la aplicación no se despertará si está en segundo plano (consulte la documentación aquí ):

Para que una notificación automática active una operación de descarga, la carga útil de la notificación debe incluir la clave de contenido disponible con su valor establecido en 1. Cuando esa clave está presente, el sistema activa la aplicación en segundo plano (o la inicia en segundo plano) y llama a la aplicación del delegado de la aplicación: didReceiveRemoteNotification: fetchCompletionHandler: method. Su implementación de ese método debe descargar el contenido relevante e integrarlo en su aplicación

Así que la carga útil debería al menos verse así:

 { aps = { "content-available" : 1, sound : "" }; } 
  1. Regístrese para notificaciones de inserción en el delegado de la aplicación.
  2. Agregue el modo de fondo en las capacidades de la aplicación.
  3. Agregue “content-available” = “1” mientras envía la notificación push (si usa firebase reemplace “content-available” = “1” por “content_available” = “true” mientras envía la notificación push desde el servidor).

Yo tuve el mismo problema. Apareció el banner de notificación, pero -application: didReceiveRemoteNotification: fetchCompletionHandler: el método no se invocó. La solución para mí que funcionó fue agregar la implementación de: application: didReceiveRemoteNotification: method y reenviar call a -application: didReceiveRemoteNotification: fetchCompletionHandler ::

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { self.application(application, didReceiveRemoteNotification: userInfo) { (UIBackgroundFetchResult) in } }