Wie erhalte ich benutzerdefinierte Daten, wenn die App durch Push-Benachrichtigung mit firebase_messaging beendet wird?

8

Wie lautet die aktuelle Problemumgehung, um benutzerdefinierte Daten zu erhalten, wenn der Benutzer beim Beenden der App auf eine Benachrichtigung klickt?

Anscheinend ist es unter Android nicht möglich , eine Datennachricht im onLaunch zu empfangen (was der ideale Weg ist). Unter IOS hatte ich es noch nicht versucht, da ich zuerst mit diesem Problem konfrontiert bin.

Irgendeine Ahnung?

Zusätzliche Informationen: Die Benachrichtigung, die ich über a sende, hat folgende firebase cloud functionForm:

  "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

Auf dem kann onResumeich eine Aktion ausführen, aber das onLaunchscheint nicht aufgerufen zu werden.

Stefano Saitta
quelle
Sie können versuchen, benutzerdefinierte JSON-Nutzdaten zu verwenden .
Champion-Läufer

Antworten:

2

Dies ist das Format, das Ihre Nutzdaten mit den enthaltenen Daten annehmen sollten. Es funktioniert so, wie ich es in meinem Projekt zum Laufen gebracht habe. Um alles richtig zum Laufen zu bringen, gibt es hier eine Antwort , die für die allgemeine Projekteinrichtung hilfreich sein kann:

 {
      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_
quelle
Was soll der androidSchlüssel tun?
Stefano Saitta
Es gibt bestimmte Eigenschaften, die sich nur auf eine Plattform beziehen. Das Android ist nur für Android-Benachrichtigungen und Apns ist für iOS.
DF_
2

Ich denke, Sie erhalten bereits Daten auf Launch, müssen nur ein wenig warten. Ich habe es geschrieben, weil ich auf dasselbe gestoßen bin.

Kannst du das versuchen,

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

Auch in meiner Situation habe ich es so benutzt und gelöst.

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

Es kann etwas schwierig sein, festzustellen, ob Ihre Aktivität im Vordergrund steht (und anders zu reagieren). Am liebsten registriere BroadcastReceiverich einen Einheimischen in der Aktivität und mache dann einen sendBroadcastvom Dienst. Mit dieser Methode erhalten Sie true , wenn Ihr Receiver ausgeführt wird (dh Ihre App steht im Vordergrund, andernfalls false .

Sie können ein Beispiel für diesen sehen (unter Verwendung von GCM, aber die Logik ist das gleiche für FCM) Quelle

Auch dies ist ein großartiges Beispiel für MyFirebaseMessagingService

Champion-Läufer
quelle
0

In Ihrem Provider können Sie die folgende zusätzliche Konfiguration vornehmen. Wenn dies in Ihrem Debug korrekt durchgeführt wurde, sollten Sie ein Token visualisieren:

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

    }
}

Mit diesem Paket: https://pub.dev/packages/firebase_messaging in Ihrem Projekt und in Ihrer Firebase unter Cloud Messaging -> Optionen -> Persönliche Daten -> Schlüssel (click_action) -> Wert (FLUTTER_NOTIFICATION_CLICK), den Sie hinzufügen müssen FLUTTER_NOTIFICATION_CLICK.

Damit können Sie bereits Ihre Firebase-Push-Benachrichtigungen ausprobieren.

Victwise
quelle
Dies ist, was ich bereits habe, aber es scheint nicht zu funktionieren, onLaunchwenn Sie eine Benachrichtigung mit datadarin senden
Stefano Saitta