Como receber dados personalizados quando o aplicativo é finalizado através da notificação por push usando firebase_messaging?

8

Como no título, qual é a solução atual para receber dados personalizados quando o usuário clica em uma notificação quando o aplicativo é finalizado?

Parece que no Android não é possível receber uma mensagem de dados no onLaunch (que é a maneira ideal) No IOS, eu ainda não havia tentado desde que estou enfrentando esse problema primeiro.

Qualquer pista?

Informações adicionais: a notificação que estou enviando por um firebase cloud functionestá neste formulário:

  "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

no onResumeeu sou capaz de executar uma ação, mas o onLaunchparece não ser chamado.

Stefano Saitta
fonte
Você pode tentar usar cargas JSON personalizadas .
campeão-runner

Respostas:

2

Esse é o formato que sua carga útil deve assumir com os dados incluídos. Funciona, pois foi assim que consegui que funcionasse no meu projeto. Além disso, para que tudo funcione corretamente, há uma resposta aqui que pode ser útil para a configuração geral do projeto:

 {
      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_
fonte
qual é a androidchave que deve fazer?
Stefano Saitta
há propriedades específicas relacionadas apenas a uma plataforma. O android é específico apenas para notificações do Android, e apns é para iOS.
DF_ 12/10/19
2

Acho que você já está obtendo dados sobre o lançamento, só precisa esperar um pouco. Eu escrevi porque me deparei com a mesma coisa.

Você pode tentar isso

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...
      });
    });
  },
);

Também na minha situação, usei assim e resolvi.

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
fonte
0

Dizer se sua Atividade está em primeiro plano (e reagir de maneira diferente) pode ser um pouco complicado. Minha maneira favorita é registrar um local BroadcastReceiverna Atividade e, em seguida, fazer um a sendBroadcastpartir do serviço. Você será verdadeiro com esse método se o seu receptor estiver em execução (o que significa que seu aplicativo está em primeiro plano e falso caso contrário.

Você pode ver um exemplo disso (usando GCM, mas a lógica é a mesma para FCM) Fonte

Este também é um ótimo exemplo MyFirebaseMessagingService

campeão-corredor
fonte
0

No seu provedor, você pode fazer a seguinte configuração adicional; se isso foi feito corretamente na sua depuração, você deve visualizar um 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);
       },

    }
}

com este pacote: https://pub.dev/packages/firebase_messaging em seu projeto e em sua base de firmas, em Cloud Messaging -> Opções -> Dados pessoais -> chave (click_action) -> valor (FLUTTER_NOTIFICATION_CLICK) que você precisa adicionar FLUTTER_NOTIFICATION_CLICK.

Com isso, você já pode tentar suas notificações push do firebase.

victwise
fonte
Isto é o que eu já tenho, mas não parece funcionar onLaunchse você enviar uma notificação com datanela
Stefano Saitta