Cordova-plugin-firebase: onNotificationOpen no se dispara si la aplicación está cerrada: el proceso de la aplicación se cancela en segundo plano.

Creado en 24 nov. 2016  ·  46Comentarios  ·  Fuente: arnesson/cordova-plugin-firebase

Hola,

No sé si este comportamiento predeterminado o no. Pero cuando la aplicación está cerrada (el proceso de la aplicación se cancela), luego llega la notificación push y se toca, onNotificationOpen no se activa. ¿Es esto como se esperaba o algo necesita trabajar en ello?

messaging

Comentario más útil

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

Todos 46 comentarios

yo también estoy enfrentando el mismo problema :(

use el evento cordova resume para volver a conectar la devolución de llamada. consulte los documentos de cordova sobre el ciclo de vida de Android: http://cordova.apache.org/docs/en/6.x/guide/platforms/android/index.html#lifecycle -guide

@robertarnesson ¿Te importaría explicar un poco más tu respuesta? Tengo el mismo problema en iOS. Puedo recibir notificaciones mientras la aplicación se ejecuta en primer plano y en segundo plano, pero tan pronto como cierro o salgo de mi aplicación, ya no puedo recibir notificaciones.

Recibo notificaciones tanto en segundo plano como en primer plano (Android 6.0.1)... Pero la notificación abierta no activa la aplicación, la notificación de la bandeja se borra después del toque y los datos de la notificación se pierden. (esto sucede incluso cuando la aplicación está en pausa). ¿Puede ser por el paso de peatones? ¿Hay alguna solución?

@robertarnesson @Taracque

No estoy seguro de si esto ayuda, pero realmente odio cuando las personas usan palabras o enlaces en lugar de sus propios ejemplos de código para tratar de ayudar.

Esta es una interpretación básica de lo que tengo en mi index.html y funciona para iOS y Android con la carga útil que se entrega a la aplicación para su manipulación.

Descubrí que con iOS solo necesitaba usar la función 'deviceready' de cordova.js, ya que parecía activarse cada vez que se recibía una notificación cuando las aplicaciones estaban en primer plano Y después de reanudar una aplicación que estaba en segundo plano, ya sea tocando el notificación o simplemente abriendo la aplicación.

Para Android, necesitaba usar 'currículum' ya que 'dispositivo listo' solo parecía dispararse una vez cuando la aplicación se cargó por primera vez (supongo que tiene sentido).

function onLoad(){

    //fire this with load of the HTML page
    document.addEventListener("deviceready", onDeviceReady, false);

    }

    function onDeviceReady(){

    // this will fire when the app first runs (iOS and Android)
    // iOS will run this after tapping a notification as well but not Android

    // Create the resume as soon as the device is ready.
    document.addEventListener("resume", onResume, false); 

    // add initial cordova-plugin-firebase function calls here
    // e.g TokenRefresh, onNotificationOpen etc

    window.FirebasePlugin.onTokenRefresh(function(token){

    //Do something with the token server-side if it exists

    });

    // get any initial or resume notification (used for iOS)
    var payload = getNotification();

    }

    function getNotification(){

    // get any notification variables for use in your app
    window.FirebasePlugin.onNotificationOpen(function(notification){

    //Check if notification exists then do something with the payload vars
    var str = JSON.stringify(notification);
    console.log(str);

    });

    return str;

    }

    function onResume(){
    //Add plugin functions here after app has resumed from background
    // or after notification is tapped (needed for Android)

    //get resume notification and payload (needed for Android)

    var payload = getNotification();

    }

hola chicos, creo que nos perdemos el punto aquí. la aplicación en sí, ni siquiera en segundo plano o en primer plano. intenta eliminar la aplicación y la función no se activa, no podemos usarla en la reanudación porque la aplicación no se suspendió, la aplicación no se movió al primer plano sino que se inició. incluso después de que el dispositivo esté listo, onNotification open no se activa.

No estoy seguro de entender, pero es esto correcto.

1: tu aplicación está totalmente inactiva
2: recibe una notificación nativa para la aplicación
3 haces clic en notificación
4 se carga la aplicación
5 onNotificationOpen no se activa

¿Es esto correcto?

¿Para qué sistema operativo es esto?

¿Puedes proporcionar algo de tu código?

¿Incluiste Cordova.js en tu script?

¿Está 100% seguro de que no tiene errores js en la página de carga?

@device68 Me gustaría saber si onNotificationOpen se activa cuando la aplicación no se inicia inicialmente, como dijo @nikrhes .
He probado tanto en Android como en iOS con onNotificationOpen invocado en el currículum y listo para el dispositivo. Y solo la situación que mencioné anteriormente no funcionó. También hay algunos comportamientos inesperados con otras situaciones también.
Podría consultar el número 137 que abrí.

@chanphillip , le echaré un vistazo por la mañana. No puedo confirmar iOS 10 porque estoy usando una versión anterior de XCODE, pero veré qué sucede exactamente en Android.

Mi aplicación hace un uso significativo tanto del arranque en frío con las cargas útiles de las notificaciones como del currículum, pero no ha notado ningún problema.

@device68 toda la situación funciona bien solo cuando la aplicación está inactiva, la función no se activa en absoluto. Estoy probado, casi en todos los sistemas operativos IOS y Android que puedo tener en mis manos. Sigue sin funcionar.

Por lo que recuerdo durante mis pruebas de hoy en Android, esto es lo que sucede.

1 aplicación inactiva

Si recibo una notificación y hago clic en ella, esto carga la aplicación como se esperaba y cualquier código de complemento dentro de onDeviceReady capturará esa carga útil.

Cualquier código dentro de Resume no capturará la carga útil.

Cualquier notificación adicional mientras la aplicación aún está activa y aún no se ha minimizado, se recibe mediante funciones dentro de onDeviceReady.

2 minimizando la aplicación por primera vez.

La primera vez que minimizo la aplicación, se detiene en DeviceReady porque la decisión ya está lista y ahora espera el estado de reanudación.

Si recibo una notificación y la toco, la aplicación se abre y el código del complemento dentro de Resume ahora captura la carga útil.

Resume recibe todas las notificaciones posteriores.

3 aplicaciones minimizadas (en términos generales)

Si mi aplicación se minimiza en cualquier momento y hago clic en una notificación, Reanudar captura esto, PERO si no hago clic en ella y abro la aplicación manualmente, Reanudar no hace nada y no se activa onNotificationOpen en ninguna parte de mi código.

Tenga en cuenta que esta actividad es totalmente diferente en iOS 9.3

4 aplicaciones en primer plano

Si después de reanudar recibo una notificación mientras estoy en la aplicación, Resume captura la carga útil.

5 aplicaciones para matar

Si mato la aplicación, comenzamos desde el n. ° 1

6 cargas útiles

Las dos diferencias que he visto con los datos que GCM envía en Android dependen de si se hizo clic en la notificación fuera de la aplicación o si se recibió mientras está en primer plano.

Google agrega código de tiempo, desde, ID de mensaje, etc. si se toca la notificación.

Google elimina lo anterior pero agrega simplemente tocar = falso en todas las demás circunstancias.

Cualquier variable de datos que envíe está presente en todos los casos.

Estoy usando la API Curl del lado del servidor para enviar mensajes entre la web, Android e iOS

En última instancia, todo parece lógico en Android, en realidad es la implementación de iOS la que es incorrecta e ilógica.

Todo en iOS funciona con onDeviceReady y se llama a onNotificationOpen cada vez que se recibe una notificación, incluso cuando abre una aplicación manualmente después de recibir una notificación, hacer clic en un mensaje o recibir una notificación mientras la aplicación está en primer plano.

Espero que esto ayude.

Pero debe usar onDeviceReady y Resume y colocar versiones de onNotificationOpen debajo de cada uno si desea capturar la carga útil en todas las situaciones.

@device68 Gracias por su explicación detallada.
De hecho, lo dije mal, también estaba poniendo onNotificationOpen en la reanudación del dispositivo y listo, pero el caso de uso 1 (hacer clic en la notificación cuando la aplicación ni siquiera se ha iniciado) no funcionó de mi parte, mientras que los otros casos de uso sí funcionan. como lo que describiste.

Supongo que no está utilizando un marco iónico durante la prueba. Estoy usando platform.ready() pero debería ser lo mismo que deviceready según tengo entendido.

¿Podría confirmar que onNotificationOpen se activa incluso cuando la aplicación no se inicia (la aplicación se eliminó) de su lado? ¿También es posible que pruebes esto en iOS también? Gracias.

@chanphillip no hay problema, me alegro de poder ayudar.

Correcto, solo estoy usando el complemento phonegap sin procesar instalado a través de CLI y luego este complemento instalado dentro de él.

Hmm, en realidad hice algunas pruebas adicionales y creé un video de mi dispositivo con alertas en 4 lugares.

https://www.youtube.com/watch?v=xrWQH2wE8Fo

Esto parece confirmar lo que estás viendo. onNotificationOpen NO se dispara en absoluto al tocar una notificación que provoca un arranque en frío de la aplicación. Solo después de esto, las notificaciones se recopilan desde la función onNotificationOpen.

Los oyentes se disparan como se esperaba, pero no en NotificationOpen.

Para mí, esto no es específicamente un problema para mi aplicación, lo que probablemente explica por qué no la había visto hasta ahora.

He probado en dispositivos con Android 4+, 6+ y 7+, todos con el mismo resultado.

Desafortunadamente, no creo que pueda ayudar mucho con iOS, estoy usando Virtualbox con Yosemite y XCODE 7.1 (obligado a incluir el SDK de iOS 9.3). Encontré que las notificaciones funcionaban exclusivamente con onDeviceRedy y ni siquiera necesitaba usar Resume. Esto fue para dispositivos con iOS 9+ pero por debajo de 10+

Sin embargo, los usuarios finales actualizaron sus teléfonos a 10.2 y las notificaciones dejaron de funcionar. Creo que se debe a mi creación de XCODE con 9.3 SDK, ahora necesito comprar una Mac :-(

Déjame saber si el video ayuda.

Me enfrento al mismo problema. La aplicación se abre pero no activa la función. Traté de reproducir el comportamiento en tu video y, por supuesto, estoy esperando el estado listo para el dispositivo. Pero el método nunca se activa.

Tenga en cuenta: al evaluar la función a través del enchufe de la mesa de luz, funciona. SOLO funciona cuando lo evalúo en el IDE. Pero la función nunca se activa, como que la versión del complemento del método "no se llama". ¿Por qué evaluar la función funciona?

Hola,
Estoy enfrentando el mismo problema, así que estoy tratando de entender qué está pasando en el código.
Para el caso de uso de arranque en frío, el documento dice usar onNewIntent.
El código del complemento se ve bien.

    <strong i="9">@Override</strong>
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        FirebasePlugin.sendNotification(intent.getExtras());
    }

Pero esta devolución de llamada necesita que la notificación establezca la intención de comenzar a usar click_action en la carga útil

{
  "to": "/topics/news",
  "notification": {
    "title": "Click Action Message",
    "text": "Sample message",
    "click_action": "android.intent.action.MAIN"
  }
}

Estoy tratando de hacerlo pero sin éxito, no estoy seguro de querer debe configurarse en acción de clic.
Cualquiera que sea el valor que configuré, la aplicación no se inicia

        <activity android:name="MainActivity" >
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Para evitar la falta de acción de clic, tal vez sería bueno leer el contenido adicional durante el inicio del complemento.
Probé con este código y esta vez recibí la notificación.

<strong i="21">@Override</strong>
    protected void pluginInitialize() {
        final Context context = this.cordova.getActivity().getApplicationContext();
        final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
        this.cordova.getThreadPool().execute(new Runnable() {
            public void run() {
                Log.d(TAG, "Starting Firebase plugin");
                mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
                if(extras != null && extras.size()>1) {
                    FirebasePlugin.sendNotification(extras);

                }
            }
        });
    }

De todos modos, parece un truco sucio.

Ok, me las arreglé para usar click_action agregando una categoría predeterminada en el manifest.xml pero onNewIntent no se llama.

            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

FirebasePlugin.java

<strong i="6">@Override</strong>
protected void pluginInitialize() {
    final Context context = this.cordova.getActivity().getApplicationContext();
    final Bundle extras = this.cordova.getActivity().getIntent().getExtras();
    this.cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            Log.d(TAG, "Starting Firebase plugin");
            mFirebaseAnalytics = FirebaseAnalytics.getInstance(context);
            if(extras != null && extras.size()>1) {
                // FirebasePlugin.sendNotification(extras);
                if (FirebasePlugin.notificationStack == null) {
                    FirebasePlugin.notificationStack = new ArrayList<Bundle>();
                }
                notificationStack.add(extras);

            }
        }
    });
}

Tuve el mismo problema que se describió anteriormente, principalmente, la carga útil de la notificación no se entregó cuando se inició la aplicación tocando una notificación. La sugerencia de @ huny0522 parece solucionar el problema. 👍

Interesante, no necesito esto específicamente, pero también lo intentaré y veré si funciona para mí. Sería ideal si los desarrolladores de este complemento pudieran implementar este cambio de alguna manera, ya que parece ser un gran problema para la mayoría de las personas que necesitan carga útil de notificación después del arranque en frío de una aplicación.

¿¡Este problema está solucionado o se solucionará en la próxima versión!?

El parche de @huny0522 no me resolvió el problema. onNotificationReceived se ignoró la devolución de llamada con el inicio en frío de Android. Todos los demás escenarios se comportan como se esperaba.

Reinstalar el complemento de github resolvió el problema por mí, después de probar todas las soluciones sugeridas

Complemento cordova agregue https://github.com/arnesson/cordova-plugin-firebase.git --save

Alguien ha resuelto el

paso 3 que escribió @device68 ??

aplicación minimizada (en términos generales)

Si mi aplicación se minimiza en cualquier momento y hago clic en una notificación, Reanudar captura esto, PERO si no hago clic en ella y abro la aplicación manualmente, Reanudar no hace nada y no se activa onNotificationOpen en ninguna parte de mi código.

Este es mi único problema ahora.

Problema similar aquí.

Tuve que eliminar esta línea del objeto enviado: "click_action":"YOUR_DATA_HERE".

Ahora, la aplicación se inicia correctamente cuando toco la notificación recibida en segundo plano.

Espero eso ayude.

También tengo los mismos problemas en una aplicación ionic/cordova, pero solo en un dispositivo con Android 6.0. En este dispositivo, la notificación siempre se activa en la barra de estado, ya sea que tenga la aplicación en segundo plano o en primer plano (!) Y la devolución de llamada nunca se activa cuando abro la notificación, por lo que no obtengo la carga útil.
Todos los demás dispositivos que probé estaban bien (Android 5, iOS 9 y 10): en primer plano activa los datos de devolución de llamada y reacciono, y en segundo plano recibe la notificación normalmente en la barra de estado como se describe en los documentos.

@abhishek-kollipara el problema discutido no es cómo recoger la carga útil en el estado de primer plano/fondo, sino cuando la aplicación se inicia en frío al tocar una notificación y recoger la carga útil de la notificación. este no es el problema de cómo se forma la carga útil, especialmente cuando se describe en los documentos de otro complemento y no en este.

Tuve mi primer éxito al capturar la carga útil en un arranque en frío desde los últimos dos días cuando comencé a buscarla. obtenga el complemento nativo iónico 'web intent'. instálelo como se documenta y use su función integrada getIntent() en el arranque. si la aplicación se inicia mediante una notificación, los datos de la notificación estarán en algún lugar dentro del objeto devuelto.

@heidji ¿ Esto funciona en IOS?

En mi caso:

Androide:
-Arranque en frío: Iniciar OnNotificationOpen
-Aplicación minimizada: Iniciar OnNotificationOpen
-Aplicación en primer plano: Iniciar OnNotificationOpen

IOS:
-Arranque en frío: NO iniciar OnNotificationOpen
-Aplicación minimizada: Iniciar OnNotificationOpen
-Aplicación en primer plano: Iniciar OnNotificationOpen

Gracias por la ayuda

@Hanzofm No sé si funciona en iOS para ser honesto. solo intente usar el complemento Web Intent y registre su salida en la consola al arrancar.

Tengo el mismo comportamiento en iOS descrito por @Hanzofm

Tengo el mismo comportamiento en iOS. onNotificationOpen no se llama en el inicio en frío de la aplicación iOS al hacer clic en la notificación. Usando la versión del complemento 0.1.25.

Actualizar:
También estaba usando "cordova-plugin-local-notifications" con el complemento firebase y eso causó el problema. Cuando eliminé el complemento "cordova-plugin-local-notifications", funcionó bien.

También tengo problemas para obtener noNotificationOpen para disparar en arranques en frío (iOS). ¿Hay una solución por ahí?

Gracias

En mi caso se resolvió eliminando el complemento de notificaciones locales. Hay una incompatibilidad con este complemento y los complementos de notificación automática.

No tengo ese complemento, desafortunadamente :)

¿Se supone que esto debe estar encendido?

skjermbilde 2018-04-27 kl 09 22 50

Cierre por limpieza. Pruebe con la última versión y vuelva a abrir si sigue siendo un problema.

@heidji digamos que resolvimos el problema usando su método, ¿tiene alguna información sobre cómo obtener los datos de notificación en la siguiente situación?

La aplicación está completamente cerrada. El usuario recibe una notificación push. El usuario no hace clic en la notificación, sino que la elimina de la barra de notificaciones. El usuario abre la aplicación más tarde y va a la página de notificaciones y no ve nada. Porque el usuario no recibe la notificación en primer plano ni hace clic en ella para abrir la aplicación. Pero aún necesitamos saber que esta notificación existe para mostrar al usuario. ¿Cómo hacer esto en ionic3?

@akildemir no hay forma de hacerlo en Ionic, tendrá que registrar notificaciones en su propio servidor y recuperarlas cuando el usuario abra la aplicación como lo haría cualquier persona normalmente.

@heidji, ¿cómo voy a registrar las notificaciones en mi servidor para recuperarlas, si no sé que existe esta notificación?
¿Hay alguna forma en que firebase también envíe las notificaciones a mi servidor con el dispositivo o quisiste decir no usar firebase sino usar tu propio servidor para las notificaciones?

@akildemir Me refiero a que cuando CREA una notificación automática, también registra su existencia en otro lugar, como en su propio servidor o en cualquier servidor que esté utilizando para su proyecto. Creo que firebase también proporciona estos servicios.
No sé cómo creas estas notificaciones, pero en mi proyecto, cuando algo sucede en mi servidor PHP, por ejemplo, alguien te envió un mensaje, me comunico con firebase para enviar una notificación y TAMBIÉN almaceno este evento con un "is_read = 0". bandera, por lo que si el usuario nunca hace clic en la notificación, puede recuperarla en el sitio web o la aplicación usa su propio servicio para llamar a estas notificaciones o lo que sea, solo cosas de desarrollo estándar.

@heidji No tengo un sitio web para mi aplicación, pero sí, lo que dijiste es bastante lógico. Puedo almacenar la notificación en mi servidor al mismo tiempo y recuperarla más tarde. ¡Gracias! y sí, puedo contarme como novato en cosas de desarrollo móvil. También puedo preguntar algo más? ¿Cómo puedo registrar la misma notificación en varios dispositivos a través de Firebase? puedes pensar en ello como un chat grupal. Cuando alguien escribe algo en el chat grupal, todos en el grupo lo entienden. Estoy usando este formato para registrar una notificación:

dejar cuerpo = {
"notificación":{
"título":"título" , "body":"body" ,
},
"datos":{
"parámetro1": "valor1"
},
"a": DeviceId ,
"prioridad":"alta",
"restricted_package_name":""
}

  let options = new HttpHeaders().set('Content-Type','application/json');
  this.http.post("https://fcm.googleapis.com/fcm/send",body,{
    headers: options.set('Authorization', 'key=),
  })

aquí, si pasa deviceId a la sección "a", se envía al dispositivo. pero ¿puedo pasar múltiples ID de dispositivo aquí?

@nikrhes Puede verificarlo en metadatos:
ventana.FirebasePlugin.onNotificationOpen().subscribe((datos) => {
si (datos.toque) {
// usuario tocando la notificación
} demás {
// la aplicación se ejecuta en primer plano
}
});

No estoy seguro de que esto se haya resuelto alguna vez, pero he estado buscando la respuesta durante meses a través de los diversos hilos que existen al respecto. Para ser claros, el problema es que OnNotification no se activa específicamente en el caso de iOS, donde la aplicación está completamente cerrada/desactivada/desactivada. Aparece la notificación, inicia la aplicación en frío, pero la función no se activa y la carga útil no se entrega.

@heidji : su solución alternativa para almacenar los eventos de inserción en el servidor y verificar si se han leído tiene sentido. Sin embargo, en nuestra aplicación hay escenarios en los que esto no funcionará (es decir, y necesitamos determinar si la notificación se activa en función de si el usuario realmente hizo clic en ella, no si la leyó).

Pero lo principal, como tantos otros han dicho, ¿es que este parece ser un comportamiento crítico para el que debe haber una solución?

@wwwguy mi solución no es una solución alternativa. es una práctica estándar que todos usan, grandes o pequeños.
no puede confiar en las pulsaciones de notificación, estos no son eventos garantizados. Quiero decir, cuando presiono una notificación de Facebook en mi teléfono xiaomi, a veces la aplicación ni siquiera se abre.

Si entiendo. Hemos implementado docenas de aplicaciones para muchos clientes diferentes. Usamos la práctica de rastrear las "lecturas" de notificaciones en el servidor también en varias de nuestras aplicaciones. Pero hay otros casos a considerar, es decir, notificaciones que son más que simples notificaciones, sino que llevan cargas útiles que luego dirigen ciertas funciones dentro de la aplicación si se hace clic en ellas. Facebook es una mierda. Todo el mundo sabe esto. Pero las notificaciones de FB también son solo eso, notificaciones simples (que simplemente aparecen en una lista de archivos dentro de la aplicación). No son de naturaleza funcional. es decir, no hay ciertos tipos de notificaciones de FB que cuando haces clic en ellas necesitan abrir la aplicación y dirigirte a un lugar específico.

De todos modos... No estaba publicando necesariamente para entrar en una gran discusión filosófica (en realidad, solo le estaba dando un guiño a @heidji por la buena idea, ya que eso resolvería el problema en muchos casos). Pero seguro que todos podemos estar de acuerdo en que esto:

Aplicación abierta de Android = FUNCIONA
Aplicación abierta de iOS = FUNCIONA
Aplicación de fondo de Android = FUNCIONA
Aplicación de fondo de iOS = FUNCIONA
Arranque en frío de Android desde la aplicación eliminada = FUNCIONA
Arranque en frío de iOS desde la aplicación eliminada = NO FUNCIONA

... no es el diseño previsto del complemento. Entonces, es un error que el desarrollador no ha abordado (tal vez debido a la confusión que causa en todos estos subprocesos y diferentes personas que diagnostican erróneamente cuál es el problema), o algo más como variables pasadas en el cuerpo PUSH o funcionalidad compilada en xCode provocando este comportamiento.

Corrección de errores para el complemento por parte del desarrollador aparte... ¿alguien ha podido aislar una corrección de código manual para esto?

Honestamente, la notificación de arranque en frío en iOS funciona para mí al 100%. Usé el complemento webintent solo para Android porque onNotificationOpen no funcionó para mí allí y webintent no existe en iOS.
si necesita información específica sobre mi configuración, hágamelo saber

¿Fue útil esta página
0 / 5 - 0 calificaciones