¿Cómo recibir datos personalizados cuando la aplicación finaliza mediante una notificación push usando firebase_messaging?

8

Como en el título, ¿cuál es la solución actual para recibir datos personalizados cuando el usuario hace clic en una notificación cuando finaliza la aplicación?

Parece que en Android no es posible recibir un mensaje de datos en onLaunch (que es la forma ideal) En iOS no lo había intentado todavía desde que me enfrento a este problema primero.

¿Cualquier pista?

Información adicional: la notificación que estoy enviando a través de a firebase cloud functionestá en este formulario:

  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

https://firebase.google.com/docs/cloud-messaging/concept-options

en el onResumesoy capaz de realizar una acción, pero onLaunchparece que no se llama.

Stefano Saitta
fuente
Puedes intentar usar Custom cargas JSON personalizadas .
campeón-corredor el

Respuestas:

2

Este es el formato que debe tomar su carga útil con los datos incluidos. Funciona ya que así es como lo hice funcionar en mi proyecto. Además, para que todo funcione correctamente, hay un respuesta aquí que podría ser útil para la configuración general del proyecto:

 {
      notification: {
        title: 'A title',
        body: 'The body.'
      },
      data: {
        // your data here
      },
      android: {
        ttl: 3600 * 1000,
        notification: {
          click_action: 'FLUTTER_NOTIFICATION_CLICK'
        }
      },
      // The below is for iOS specific properties
      // apns: {
      //   payload: {
      //     aps: {
      //       badge: 42
      //     }
      //   }
      // },
      tokens: [] // or a single 'token'
    }
DF_
fuente
¿Qué se androidsupone que debe hacer la llave?
Stefano Saitta
Hay propiedades específicas que solo se relacionan con una plataforma. El Android es específico solo para notificaciones de Android, y apns es para iOS.
DF_
2

Creo que ya está obteniendo datos en el lanzamiento, solo necesita esperar un poco. Lo escribí porque me encontré con lo mismo.

¿Puedes probar esto?

firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async { .. },
  onResume: (Map<String, dynamic> message) async { .. },
  onLaunch: (Map<String, dynamic> message) async {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      Timer(const Duration(seconds: 7), () {
        // your process...
      });
    });
  },
);

También en mi situación, lo usé así y lo resolví.

onLaunch: (Map<String, dynamic> message) async {
    WidgetsBinding.instance.addPostFrameCallback((ignored) {
      Timer.periodic(const Duration(seconds: 1), (timer) {
        if (CurrentUser.currentUser != null) {
          timer.cancel(); // important **
          // redirect process with post details inside data
          if (message['data']['type'] == NotifTypes.NEW_POST)
            goGroupAndPost(Map.from(message['data'])); 
        }
      });
    });
  },
Ibrahim Karahan
fuente
0

Decir si su actividad está en primer plano (y reaccionar de manera diferente) puede ser un poco complicado. Mi forma favorita es registrar un local BroadcastReceiveren la Actividad y luego hacer una sendBroadcastdesde el servicio. Obtendrá cierto de ese método si su receptor se está ejecutando (lo que significa que su aplicación está en primer plano y falso contrario.

Puede ver un ejemplo de esto (usando GCM, pero la lógica es la misma para FCM) Fuente

También este es un gran ejemplo MyFirebaseMessagingService

campeón-corredor
fuente
0

En su proveedor, puede hacer la siguiente configuración adicional, si se realizó correctamente en su depuración, debe visualizar un token:

class PushNotificationProvider{
    FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

    initNotification(){
      _firebaseMessaging.requestNotificationPermission();
      _firebaseMessaging.getToken().then((token)){
        print('===== FCM Token ======');
        print(token);
      }
    }

    _firebaseMessaging.configure{
      onMessage(info){
         print('===== On Message =====');
         print(info);
       },
     onLaunch(info){
         print('===== On Launch =====');
         print(info);
       },
     onResume(info){
         print('===== On Resume =====');
         print(info);
       },

    }
}

con este paquete: https://pub.dev/packages/firebase_messaging en su proyecto y en su base de fuego, en Cloud Messaging -> Opciones -> Datos personales -> clave (click_action) -> value (FLUTTER_NOTIFICATION_CLICK) que necesita agregar FLUTTER_NOTIFICATION_CLICK.

Con esto, ya podrías probar tus notificaciones push de Firebase.

victwise
fuente
Esto es lo que ya tengo, pero parece que no funciona onLaunchsi envía una notificación con dataél
Stefano Saitta