La aplicación Ionic / Cordova no recibe notificación push en el fondo

Mi aplicación para Android no recibe notificaciones push en segundo plano y debe estar de acuerdo con la documentación .

No es necesario que se ejecute una aplicación de Android en un dispositivo Android para recibir mensajes. El sistema activará la aplicación de Android mediante la difusión de intención cuando llegue el mensaje, siempre y cuando la aplicación esté configurada con el receptor de difusión adecuado y los permisos.

Tratar diferentes notificaciones descubrió que recibe las notificaciones push mientras está cerrado si y sólo si las notificaciones contienen el atributo "message" , si no, simplemente lo descarta. (Las notificaciones push son sólo objetos JSON).

Mis notificaciones contienen todo tipo de atributos, incluyendo "alerta", "id" y "título", pero sólo "mensaje" hace que Android para despertar la aplicación.

Ejemplo de notificación que no funciona :

{ event: 'message', from: '947957531940', collapse_key: 'do_not_collapse', foreground: true, payload: { alert: 'Mensaje de Prueba', title: 'Titulo Mensaje de Prueba' } } 

Ejemplo de notificación que funciona :

 { event: 'message', from: '947957531940', message: 'Contenido del mensaje de prueba.', collapse_key: 'do_not_collapse', foreground: true, payload: { alert: 'Mensaje de Prueba', title: 'Titulo Mensaje de Prueba', message: 'Contenido del mensaje de prueba.' } } 

¿Es esto un estándar de Android por diseño o estoy haciendo algo mal en mi aplicación?

Mi aplicación fue desarrollada utilizando Ionic con Córdoba.

PD: Disculpe mi inglés.

EDITAR:

Este es el código de inserción de Android dentro del módulo .run en app.js, ya que las instrucciones ng-cordova especifican:

 if (ionic.Platform.isAndroid()){ var androidConfig = { "senderID": "94*************", "ecb": "window.casosPush" }; try{ var pushNotification = window.plugins.pushNotification; } catch (ex){ } // Llamada en caso de exito var successfn = function(result){ //alert("Success: " + result); }; // Llamada en caso de error var errorfn = function(result){ window.alert("Error: " + result); }; // Llamada de casos de notificacion push window.casosPush = function(notification){ switch (notification.event){ case 'registered': if (notification.regid.length > 0){ $rootScope.data.token = notification.regid; //alert('registration ID = ' + notification.regid); } break; case 'message': $rootScope.mensajes.unshift(notification.payload); $localstorage.setArray('mensajes', $rootScope.mensajes); alert(JSON.stringify(notification)); break; case 'error': alert('GCM error = ' + notification.msg); break; default: alert('An unknown GCM event has occurred'); break; } }; try{ // Llamada de registro con la plataforma GCM pushNotification.register(successfn,errorfn,androidConfig); } catch(notification){ } } 

Después de buscar todas las preguntas en stackoverflow involucrando Cordova / Phonegap Push Plugin encontré el origen del problema. Está escrito en el código fuente del complemento, y no debería hacerlo.

El problema era que el código fuente del complemento requería que la notificación push tuviera un campo "mensaje" para activar una notificación mientras se encontraba en el fondo. Se especifica en el archivo GCMIntentService.java .

 if (extras.getString("message") != null && extras.getString("message").length() != 0) { createNotification(context, extras); } 

Los mensajes más útiles son esta respuesta y este problema en el repositorio de complementos. Por lo tanto, porque no tengo poder sobre la acción de servidor de empuje no puedo haber especificado un campo de "mensaje" en las notificaciones de empuje, no tuve otra alternativa que reescribir el código fuente.

Así que reescribí el código de la siguiente manera:

 @Override protected void onMessage(Context context, Intent intent) { Log.d(TAG, "onMessage - context: " + context); // Extract the payload from the message Bundle extras = intent.getExtras(); if (extras != null) { // if we are in the foreground, just surface the payload, else post it to the statusbar if (PushPlugin.isInForeground()) { extras.putBoolean("foreground", true); PushPlugin.sendExtras(extras); } else { extras.putBoolean("foreground", false); // Send a notification if there is a message //if (extras.getString("message") != null && extras.getString("message").length() != 0) { if (extras.getString("alert") != null && extras.getString("alert").length() != 0) { createNotification(context, extras); } } } } 

De esta forma, el complemento activa una notificación local si recibe una notificación push con el campo "alerta" en lugar de "mensaje".

Entonces, cambié el código para la notificación local sí mismo:

 public void createNotification(Context context, Bundle extras) { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); String appName = getAppName(this); Intent notificationIntent = new Intent(this, PushHandlerActivity.class); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); notificationIntent.putExtra("pushBundle", extras); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); int defaults = Notification.DEFAULT_ALL; if (extras.getString("defaults") != null) { try { defaults = Integer.parseInt(extras.getString("defaults")); } catch (NumberFormatException e) {} } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context) .setDefaults(defaults) .setSmallIcon(context.getApplicationInfo().icon) .setWhen(System.currentTimeMillis()) //.setContentTitle(extras.getString("title")) .setContentTitle(extras.getString("alert")) //.setTicker(extras.getString("title")) .setTicker(extras.getString("alert")) .setContentIntent(contentIntent) .setAutoCancel(true); /* String message = extras.getString("message"); if (message != null) { mBuilder.setContentText(message); } else { mBuilder.setContentText("<missing message content>"); } */ // Agregado mensaje predefinido mBuilder.setContentText("Haz clic para más información"); String msgcnt = extras.getString("msgcnt"); if (msgcnt != null) { mBuilder.setNumber(Integer.parseInt(msgcnt)); } int notId = 0; try { notId = Integer.parseInt(extras.getString("notId")); } catch(NumberFormatException e) { Log.e(TAG, "Number format exception - Error parsing Notification ID: " + e.getMessage()); } catch(Exception e) { Log.e(TAG, "Number format exception - Error parsing Notification ID" + e.getMessage()); } mNotificationManager.notify((String) appName, notId, mBuilder.build()); } 

Ahora la notificación en la barra de notificación mostrará primero el campo "alerta" en lugar de "título" y segundo un mensaje predefinido en lugar del campo "mensaje" que no existe en mis notificaciones push.

Entonces recompile el código con:

 ionic platform rm android ionic platform add android ionic run android 

Así que los niños, esto es lo que sucede cuando se escribe un complemento para todos, pero no se consideran casos genéricos y no documento bien. Ese complemento sólo es útil para las personas con el campo "mensaje" y "título" en sus notificaciones push.

Perdí dos días de mi pasantía por esto, me tomé mi tiempo para escribir esto para que otros no tengan que hacerlo.

Tienes razón @David prieto. El problema era que el código fuente del complemento requería que la notificación push tuviera un campo "mensaje" para activar una notificación mientras se encontraba en el fondo.

Hay una manera de poner el campo "mensaje" en la notificación push y su simple. Tabla de carga útil que tiene datos de notificación, que se envían a través de una API. Debe tener un campo "mensaje" en él. Así que la notificación push tendrá automáticamente un campo de mensaje en él y se detectará en el fondo, así como en primer plano.

  • Parse Push - Cómo abrir automáticamente una actividad sin la acción del usuario al recibir un empujón en Android
  • ¿Cómo puedo ver los errores en console.developers.google.com?
  • FCM: onMessageReceived no se llama, la notificación no llegó incluso después de enviar msg a fcm?
  • Notificación de la mensajería en la nube de Firebase Vibración
  • No se puede iniciar la aplicación de receptor com.parse.ParseBroadcastReceiver en Trigger.io
  • ¿Las notificaciones no siempre se reciben por teléfono?
  • La intención del receptor de mensajes de la nube de Google no se inicia (devolución de llamada de intención de difusión: resultado = CANCELADO paraIntención)
  • El clic de Android en la notificación no abre la Actividad adjunta
  • Tamaño de icono de la barra de estado de Android - Uso de Cordova / Phonegap Push Plugin
  • Productos de Android Gradle con notificaciones de Parse Push
  • BroadcastReceiver no se llama cuando la pantalla está bloqueada en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.