2017-03-16 11 views
5

Chcę obsłużyć wiadomość powiadomienia Firebase w tle, a także na pierwszym planie. Wyślę wiadomość, która będzie zawierała link do youtube od programisty, a gdy użytkownik kliknie na pasku powiadomień, musi skierować użytkownika, aby otworzyć łącze. Czy ktoś wie, jak to się robi?Jak obsługiwać powiadomienia Firebase na tle, a także na pierwszym planie?

public void onMessageReceived(RemoteMessage remoteMessage) { 
    // [START_EXCLUDE] 
    // There are two types of messages data messages and notification messages. Data messages are handled 
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type 
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app 
    // is in the foreground. When the app is in the background an automatically generated notification is displayed. 
    // When the user taps on the notification they are returned to the app. Messages containing both notification 
    // and data payloads are treated as notification messages. The Firebase console always sends notification 

    // [END_EXCLUDE] 

    // TODO(developer): Handle FCM messages here. 
    // Not getting messages here? See why this may be: 
    Log.d(TAG, "From: " + remoteMessage.getFrom()); 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
    } 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
    } 

    // Also if you intend on generating your own notifications as a result of a received FCM 
    // message, here is where that should be initiated. See sendNotification method below. 
} 

co zrobić, aby osiągnąć mój cel? Z góry dziękuję :)

+0

Kod napisali to tylko jedna z próbek. Przypuszczam, że przeszedłeś przez nie. Czy było w tym coś dezorientującego? Czy przejrzałeś również dokumenty? W tej chwili jest to podobne do pytania * daj mi kod *. –

+0

Wypróbuj moje rozwiązanie?
Już wypróbowałem to.
I działa
https://stackoverflow.com/questions/48897883/how-to-handle-notifications-with-fcm-when-app-is-in-either-foreground-or-backgro/48899186#48899186 –

Odpowiedz

4

Należy wysłać ładunek danych do wiadomości FCM. Ładunek danych jest odbierany w metodzie wiadomości niezależnie od tego, czy aplikacja jest na pierwszym planie czy w tle. Zajmij się tam działaniem. Podobnie jak powiadomienia o pokazie, zawsze odczytując zawartość danych lub jeśli chcesz wyświetlić okno dialogowe z ostrzeżeniem, gdy aplikacja jest otwarta lub na pierwszym planie.

o to ładowność próbki:

{ 
    "to": "registration_id_or_topic", 
    "data": { 
     "message": "This is a Firebase Cloud Messaging Topic Message!", 
     "youtubeURL": "https://youtu.be/A1SDBIViRtE" 
    } 
} 

Następnie w onMessageReceived:

public void onMessageReceived(RemoteMessage remoteMessage) { 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
     Map<String, String> receivedMap = remoteMessage.getData(); 
     String youtubeURL = receivedMap.get("youtubeURL"); 
     showNotificationWithURLAction(youtubeURL); 
    } 
    ..... 
} 

można łatwo wdrożyć showNotificationWithURLAction (...) sposobu według googlowania go. Jedna próbka jest here

+0

jak wysłać link w polu danych i jak obsługiwać ten link, gdy użytkownik kliknie? proszę pomóż mi –

+0

Zobacz odpowiedź poniżej @ Lindi Masinga. Zaktualizuję również moją odpowiedź. – drulabs

+0

Aby wysłać ładunek danych z konsoli zobacz odpowiedź poniżej @ Drake29a – drulabs

0

Jeśli chcesz przekierować użytkownika do zawartości w aplikacji niż używać Deeplink, tutaj jest jak właśnie otwarty związek, gdy zgłoszenie zostanie kliknięty:

Intent notificationIntent = new Intent(Intent.ACTION_VIEW); 
     notificationIntent.setData(Uri.parse(remoteMessage.getData().getString("url")); 
     PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
     // Resources r = getResources(); 
      Notification notification = new NotificationCompat.Builder(context) 
        .setTicker("yortext") 
        .setSmallIcon(android.R.drawable.ic_menu_report_image) 
        .setContentTitle("title") 
        .setContentText("content") 
        .setContentIntent(pendingIntent) 
        .build(); 

      NotificationManager notificationManager = (NotificationManager) context.getSystemService(Service.NOTIFICATION_SERVICE); 
      notificationManager.notify(0, notification); 

Aby wysłać ładunek wchodzić Firebase konsoli , utwórz nową wiadomość, tutaj będziesz miał zaawansowane opcje, w których możesz umieścić swoje dane w parach klucz/wartość, umieścić adres URL jak na zdjęciu poniżej.

Adding payload to Firebase message

+0

proszę nie głosuj na moje pytanie. –

+0

To nie rozwiązuje pytania zadawanego w PO. – drulabs

+0

Drake przyjmij moją prośbę o przyjaciela na FB. Chcę zapytać o więcej wątpliwości dotyczących firebase @ Drake29a –

1

Jest to możliwe duplikat this question. Nie wysyłaj "powiadomienia" w treści wiadomości Push.

Więc w zasadzie, zmieniłem ciało na żądanie powiadomienia push z:

{ 
    "data": { 
     "type" : "mytype" 
    }, 
    "notification": { 
     "title": "My Title", 
     "body": "My Notification Message" 
    }, 
    "to": "/topics/all" 
} 

Do:

{ 
    "data": { 
     "type" : "mytype", 
     "title": "My Title", 
     "body": "My Notification Message" 
    }, 
    "to": "/topics/all" 
} 

Teraz moja aplikacja wymaga onMessageReceived() za każdym razem, nawet w tle, a ja po prostu zmienił metody wykorzystania uzyskanego tytułu powiadomienia i komunikatu w danych wypychanych.

+0

Witam, moja aplikacja nie wywołuje onMessageReceived() w tle. – Avi

0

System Android zawsze będzie obsługiwał wiadomości wewnątrz pola powiadomień w polu danych. Jeśli chcesz, aby aplikacja obsługiwała powiadomienie, musisz umieścić link YouTube w polu danych w polu danych.

{ "data" : 
    { "link" : "www.youtube.com"} 
} 

To powiadomienie jest odbierane w aplikacji jako wiadomość zdalna. Użyj remoteMessage.getData(), aby uzyskać link youtube.

Zobacz https://firebase.google.com/docs/cloud-messaging/concept-options#messages-with-both-notification-and-data-payloads

+0

Witam, moja aplikacja nie wywołuje onMessageReceived() w tle. – Avi