Oto mój manifest
<service android:name=".fcm.PshycoFirebaseMessagingServices">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".fcm.PshycoFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
Gdy aplikacja jest w tle i nadchodzi powiadomienie, pojawia się domyślne powiadomienie i nie uruchamia mojego kodu onMessageReceived
.
Oto mój onMessageReceived
kod. Wywołuje to, jeśli moja aplikacja działa na pierwszym planie, a nie gdy aplikacja działa w tle. Jak uruchomić ten kod, gdy aplikacja również działa w tle?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// If the application is in the foreground handle both data and notification messages here.
// 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.
data = remoteMessage.getData();
String title = remoteMessage.getNotification().getTitle();
String message = remoteMessage.getNotification().getBody();
String imageUrl = (String) data.get("image");
String action = (String) data.get("action");
Log.i(TAG, "onMessageReceived: title : "+title);
Log.i(TAG, "onMessageReceived: message : "+message);
Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
Log.i(TAG, "onMessageReceived: action : "+action);
if (imageUrl == null) {
sendNotification(title,message,action);
} else {
new BigPictureNotification(this,title,message,imageUrl,action);
}
}
// [END receive_message]
android
firebase
firebase-cloud-messaging
Parth Patel
źródło
źródło
Not getting messages here? See why this may be: goo.gl/39bRNJ
. Rozwiązanie, podobnie jak poniższe odpowiedzi, można znaleźć w dokumentacji Wiadomości z ładunkami zarówno powiadomień, jak i danychOdpowiedzi:
1. Dlaczego tak się dzieje?
Istnieją dwa rodzaje komunikatów w FCM (Firebase Cloud Messaging):
onMessageReceived()
oddzwonienie tylko wtedy, gdy aplikacja jest na pierwszym planieonMessageReceived()
oddzwanianie, nawet jeśli aplikacja jest na pierwszym planie / w tle / zabita2. Jak to zrobić?
Aby to osiągnąć, musisz wykonać
POST
żądanie na następujący adres URL:Nagłówki
Content-Type
, Wartość:application/json
Authorization
, Wartość:key=<your-server-key>
Treść za pomocą tematów
Lub jeśli chcesz wysłać go do określonych urządzeń
3. Jak obsługiwać powiadomienie push?
Oto jak radzisz sobie z otrzymaną wiadomością:
źródło
Firebase team have not developed a UI to send data-messages to your devices, yet.
Czy zmieniło się to w ubiegłym roku?onMessageReceived
, nie zostaje wywołana i jest to poważny problem w FCM !!! Zaktualizuj również swoją odpowiedź.Aby utworzyć bibliotekę firebase do wywoływania funkcji onMessageReceived () w następujących przypadkach
nie wolno umieszczać klucza JSON „powiadomienie” w żądaniu API bazy ogniowej, ale zamiast tego należy użyć „danych”, patrz poniżej.
Następująca wiadomość nie wywoła funkcji onMessageReceived (), gdy aplikacja jest w tle lub została zabita, i nie można dostosować powiadomienia.
ale zamiast tego będzie to działać
Zasadniczo wiadomość jest wysyłana w argumencie RemoteMessage wraz z obiektem danych jako Map, a następnie możesz zarządzać powiadomieniem w onMessageReceived jak we fragmencie tutaj
źródło
Wydaje mi się, że wszystkie odpowiedzi są niekompletne, ale wszystkie zawierają coś, co jest potrzebne do przetworzenia powiadomienia zawierającego dane, gdy aplikacja jest w tle.
Wykonaj następujące kroki, aby móc przetwarzać powiadomienia, gdy aplikacja będzie działać w tle.
1. Dodaj taki filtr intencji:
do działania, które chcesz przetworzyć dane powiadomienia.
Wysyłaj powiadomienia w następnym formacie:
Kluczem jest tutaj dodać
gdzie .MainActivity jest działaniem z filtrem intencji dodanym w kroku 1.
Uzyskaj informacje o „danych” z powiadomienia w „onCreate” .MainActivity ”:
I to powinno być wszystko, co musisz zrobić. Mam nadzieję, że to komuś pomoże :)
źródło
Zgodnie z dokumentacją bazy ogniowej w wysyłaniu za pomocą bazy ogniowej , istnieje 2 rodzaje ładunku:
dane
powiadomienie
Gdy jesteś na pierwszym planie, możesz pobrać dane do FCM za pomocą onMessageReceived () , możesz pobrać dane z ładunku danych .
Gdy jesteś w tle, FCM wyświetla powiadomienie w zasobniku systemowym na podstawie informacji z ładunku powiadomienia . Tytuł, wiadomość i ikona użyte do powiadomienia na pasku zadań pochodzą z ładunku powiadomienia .
To powiadomienie jest używane, gdy chcesz automatycznie wyświetlać powiadomienia na pasku zadań, gdy aplikacja jest w tle. Aby otrzymywać dane powiadomień, gdy aplikacja jest w tle, należy dodać kliknięcie aktywności wewnątrz ładunku powiadomienia .
Umieść ten filtr intencji na swoim manifeście, w jednym z tagów aktywności. Po kliknięciu powiadomienia otworzy się aplikacja i przejdziesz bezpośrednio do czynności, którą zdefiniujesz za pomocą kliknięcia, w tym przypadku „OPEN_ACTIVTY_1”. Wewnątrz tej aktywności możesz uzyskać dane poprzez:
Korzystam z FCM dla mojej aplikacji na Androida i używam obu ładunków. Oto przykład JSON, którego używam:
źródło
Według dokumentów
Edytować :
Na podstawie tego wątku :
Nie można ustawić ładunku klikalności za pomocą konsoli Firebase. Możesz spróbować przetestować za pomocą polecenia curl lub niestandardowego serwera HTTP
źródło
Działa od lipca 2019 r
Android compileSdkVersion 28, buildToolsVersion 28.0.3 i powiadamianie firebase: 19.0.1
Po wielu godzinach analizowania wszystkich innych pytań i odpowiedzi StackOverflow oraz próbowania niezliczonych przestarzałych rozwiązań, to rozwiązanie udało się wyświetlić powiadomienia w tych 3 scenariuszach:
- Aplikacja jest na pierwszym planie:
powiadomienie jest odbierane metodą onMessageReceived w mojej klasie MyFirebaseMessagingService
- Aplikacja została zabita (nie działa w tle): powiadomienie jest automatycznie wysyłane do tacy powiadomień przez FCM. Gdy użytkownik dotknie powiadomienia, aplikacja jest uruchamiana przez wywołanie aktywności, która ma w pliku manifest android.intent.category.LAUNCHER. Możesz pobrać część danych powiadomienia, używając getIntent (). GetExtras () w metodzie onCreate ().
- Aplikacja działa w tle: powiadomienie jest automatycznie wysyłane do tacy powiadomień przez FCM. Gdy użytkownik dotknie powiadomienia, aplikacja zostanie przeniesiona na pierwszy plan, uruchamiając działanie z manifestem android.intent.category.LAUNCHER. Ponieważ moja aplikacja ma launchMode = "singleTop" w tym działaniu, metoda onCreate () nie jest wywoływana, ponieważ jedno działanie tej samej klasy jest już utworzone, zamiast tego wywoływana jest metoda onNewIntent () tej klasy, a użytkownik otrzymuje część danych powiadomienie tam za pomocą intent.getExtras ().
Kroki: 1– Jeśli zdefiniujesz główną aktywność aplikacji w następujący sposób:
2- dodaj te linie w metodzie onCreate () klasy MainActivity.class
i te metody do tej samej klasy MainActivity.class:
3- utwórz klasę MyFirebase w następujący sposób:
4- utwórz nową klasę NotificationActivity.class w następujący sposób:
}
5- Dodaj te wiersze do manifestu aplikacji, wewnątrz swoich tagów
6- dodaj te linie w metodzie Application.java onCreate () lub w metodzie MainActivity.class onCreate ():
Gotowy.
Teraz, aby działało to dobrze w 3 wymienionych scenariuszach, musisz wysłać powiadomienie z konsoli internetowej Firebase w następujący sposób:
W sekcji Powiadomienie: Tytuł powiadomienia = Tytuł do wyświetlenia w oknie powiadomień (opcjonalnie) Tekst powiadomienia = Wiadomość do pokazania użytkownikowi (wymagane) Następnie w sekcji Cel: Aplikacja = aplikacja na Androida oraz w sekcji Opcje dodatkowe: Kanał powiadomień na Androida = default_channel_id Niestandardowy klucz danych: wartość tytułu: (tutaj ten sam tekst niż w polu Tytuł sekcji Powiadomienie) klucz: wartość ciała: (ten sam tekst tutaj niż w polu Wiadomość w sekcji Powiadomienie) klucz: wartość aktywności click: .MainActivity Sound = Wyłączony
wygasa = 4 tygodnie
Możesz go debugować w emulatorze za pomocą API 28 z Google Play.
Miłego kodowania!
źródło
Ponieważ te,
display-messages
które są wysyłane z interfejsu powiadomień Firebase, działa tylko wtedy, gdy aplikacja jest na pierwszym planie. Dladata-messages
, istnieje potrzeba, aby wykonać połączenie POST do FCMKroki
Zainstaluj rozszerzenie Advanced Chrome dla klienta Google Rest
Dodaj następujące nagłówki
Klucz : Content-Type, Value : application / json
Klucz : autoryzacja, wartość : klucz = „klucz serwera”
Dodaj ciało
Jeśli używasz tematów:
Jeśli używasz identyfikatora rejestracji:
Otóż to!. Teraz słuchaj
onMessageReceived
oddzwaniania jak zwykle.źródło
Aby przechwycić wiadomość w tle, musisz użyć
BroadcastReceiver
i dodaj to do swojego manifestu:
źródło
nie jest wywoływany za każdym razem, gdy jest wywoływany tylko wtedy, gdy aplikacja jest w polu
istnieje jedna metoda zastępowania, którą wywołuje się za każdym razem, bez względu na to, która aplikacja jest na pierwszym planie, w tle lub została zabita, ale ta metoda jest dostępna w tej wersji interfejsu API
to jest wersja, którą musisz zaimportować z poziomu
to jest metoda
z poprzednim interfejsem firebase tej metody nie było, więc w tym przypadku sama podstawa uchwytu przeciwpożarowego, gdy aplikacja jest w tle .... teraz masz tę metodę, co chcesz zrobić ... możesz to zrobić tutaj w tej metodzie ... ...
jeśli używasz poprzedniej wersji, wówczas rozpocznie się domyślna aktywność. W takim przypadku możesz uzyskać dane w ten sam sposób
// rób co chcesz ...}
generalnie jest to struktura z serwera, którą otrzymujemy w powiadomieniu
od Ciebie zależy, jak chcesz podać ten klucz danych, czy chcesz powiadomić cokolwiek, co możesz dać ....... cokolwiek dasz tutaj z tym samym kluczem, otrzymasz te dane ........ .
istnieje kilka przypadków, gdy nie wysyłasz akcji kliknięcia w tym przypadku, gdy klikniesz powiadomienie, otworzy się domyślna aktywność, ale jeśli chcesz otworzyć swoją konkretną aktywność, gdy aplikacja jest w tle, możesz wywołać swoją aktywność z tej metody handleIntent, ponieważ to jest wywoływany za każdym razem
źródło
Według dokumentów: 17 maja 2017 r
Dlatego należy użyć zarówno powiadomienia o ładunku, jak i danych:
Nie ma potrzeby korzystania z klikalności. Powinieneś po prostu uzyskać egzaminy z zamiaru działania LAUNCHER
Kod Java powinien znajdować się w metodzie onCreate na MainActivity:
Możesz przetestować oba powiadomienia o ładunku + dane z konsoli powiadomień Firebase . Nie zapomnij wypełnić niestandardowych pól danych w sekcji Opcje zaawansowane
źródło
Oto bardziej jasne pojęcia na temat komunikatu bazy ogniowej. Znalazłem to od ich zespołu wsparcia.
Firebase ma trzy typy wiadomości :
Powiadomienia : Powiadomienie działa w tle lub na pierwszym planie. Gdy aplikacja działa w tle, powiadomienia są dostarczane na tacę systemową. Jeśli aplikacja jest na pierwszym planie, wiadomości są obsługiwane przez
onMessageReceived()
lubdidReceiveRemoteNotification
oddzwaniane. Są to tak zwane komunikaty displayowe.Wiadomości danych : na platformie Android wiadomości danych mogą działać w tle i na pierwszym planie. Komunikat danych będzie obsługiwany przez onMessageReceived (). Uwaga dotycząca konkretnej platformy brzmiałaby następująco: na Androidzie ładunek danych można pobrać w celu, który posłużył do uruchomienia Twojej aktywności. Aby to rozwinąć, jeśli masz
"click_action":"launch_Activity_1"
, możesz pobrać tę intencjęgetIntent()
tylko zActivity_1
.Wiadomości zawierające zarówno powiadomienia, jak i ładunki danych : w tle aplikacje odbierają ładunek powiadomień na pasku powiadomień i obsługują ładunek danych tylko wtedy, gdy użytkownik stuknie powiadomienie. Na pierwszym planie aplikacja otrzymuje obiekt wiadomości z dostępnymi obiema ładunkami. Po drugie,
click_action
parametr ten jest często używany w ładunku powiadomień, a nie w ładunku danych. Jeśli zostanie użyty wewnątrz ładunku danych, ten parametr będzie traktowany jako niestandardowa para klucz-wartość, a zatem konieczne będzie zaimplementowanie niestandardowej logiki, aby działał zgodnie z przeznaczeniem.Ponadto zalecam użycie
onMessageReceived
metody (patrz Komunikat danych) w celu wyodrębnienia pakietu danych. Z twojej logiki sprawdziłem obiekt pakietu i nie znalazłem oczekiwanej zawartości danych. Oto odniesienie do podobnego przypadku, który może zapewnić większą przejrzystość.Aby uzyskać więcej informacji odwiedź mój ten wątek
źródło
2017 zaktualizowana odpowiedź
Oto wyraźna odpowiedź od doktorów na ten temat:
źródło
Proste takie podsumowanie
jeśli Twoja aplikacja jest uruchomiona;
wyzwala.
jeśli Twoja aplikacja nie działa (zabita przez przeciągnięcie);
nie jest uruchamiany i dostarczany przez direclty. Jeśli masz jakąś parę kluczy klucz-wartość. Nie działają, ponieważ onMessageReceived () nie działa.
Znalazłem w ten sposób;
W działaniach związanych z uruchamianiem umieść tę logikę,
w tym bloku if wyszukaj klucze zgodnie z interfejsem firebase.
W tym przykładzie mój klucz i wartość jak wyżej; (przepraszam za język =))
Kiedy mój kod działa, pojawia się „com.rda.note”.
za pomocą tego wiersza kodu zamknąłem aplikację i otworzyłem Google Play Market
szczęśliwego kodowania =)
źródło
Wymyśliłem scenariusze,
Gdy aplikacja jest w planie , onMessageReceived () wywoływana jest metoda z FirebaseService .so pendingIntent zdefiniowane w klasie usługi zostanie wywołana.
A gdy aplikacja jest w tle , wywoływana jest pierwsza aktywność .
Teraz, jeśli użyjesz działania splash , musisz pamiętać, że zostanie wywołana splashactivity, w przeciwnym razie, jeśli nie ma splashActivity, wówczas wywoływane będzie cokolwiek pierwsze działanie.
Następnie trzeba sprawdzić getIntent () z firstActivity aby zobaczyć, czy to ma jakieś zawiniątko .Jeżeli wszystko jest w porządku, widać wiązka jest tam z wartościami wypełnione. Jeśli wartość w znaczniku danych wysyłane z serwera wygląda jak ten,
Następnie w pierwszym działaniu zobaczysz, że istnieje poprawna intencja ( getIntent () nie ma wartości null ), ważny pakiet i wewnątrz pakietu, będzie cały JSON wspomniany powyżej z danymi jako kluczem .
W tym scenariuszu kod do wyodrębnienia wartości będzie wyglądał następująco:
źródło
Dziękuję wszystkim za odpowiedzi. Ale rozwiązałem ten problem, wysyłając wiadomość danych zamiast powiadomienia . Kod serwera
I złapał dane w onMessageReceived
źródło
Całkowicie usuń ładunek powiadomienia z żądania serwera. Wysyłaj tylko dane i przetwarzaj je, w
onMessageReceived()
przeciwnym razieonMessageReceived
aplikacja nie zostanie uruchomiona, gdy aplikacja będzie działała w tle lub zostanie zabita.Oto, co wysyłam z serwera:
Możesz więc otrzymać swoje dane w
onMessageReceived(RemoteMessage message)
następujący sposób: (powiedzmy, że muszę uzyskać identyfikator)Podobnie możesz uzyskać wszelkie dane, które wysłałeś z serwera
onMessageReceived()
.źródło
Łatwy sposób wysyłania wiadomości, nawet jeśli aplikacja jest w tle i na pierwszym planie, w następujący sposób: - Aby wysłać wiadomość za pomocą interfejsu API, możesz użyć narzędzia o nazwie AdvancedREST Client, jego chromowanego rozszerzenia i wysłać wiadomość o następujących parametrach.
Reszta narzędzia klienta Link: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
użyj tego adresu URL: - https://fcm.googleapis.com/fcm/send Content-Type: application / json Autoryzacja: key = Twój klucz serwera From lub klucz autoryzacji (patrz poniżej ref)
Klucz autoryzacji można uzyskać, odwiedzając konsolę programistów Google i klikając przycisk Poświadczenia w menu po lewej stronie swojego projektu. Wśród wymienionych kluczy API klucz serwera będzie Twoim kluczem autoryzacyjnym.
I musisz umieścić identyfikator tokena odbiornika w sekcji „do” żądania POST wysłanego za pomocą interfejsu API.
źródło
chcesz pracować na onMessageReceived (RemoteMessage remoteMessage) w tle wyślij tylko część powiadomienia część danych to:
„AnotherActivity”: „True”, „to”: „identyfikator urządzenia lub token urządzenia”
Dzięki temu onMessageRecivied jest tłem połączenia i pierwszym planem, nie trzeba obsługiwać powiadomień za pomocą zasobnika powiadomień na temat działania programu uruchamiającego. Obsługa ładunku danych przy użyciu tego:
źródło
Czerwiec 2018 Odpowiedź -
Musisz upewnić się, że w wiadomości nie ma słowa kluczowego „powiadomienie”. Uwzględnij tylko „dane”, a aplikacja będzie w stanie obsłużyć wiadomość w onMessageReceived, nawet jeśli będzie w tle lub zostanie zabita.
Korzystanie z funkcji chmury:
Następnie w twojej onMessageReceived (), w twojej klasie rozszerzającej com.google.firebase.messaging.FirebaseMessagingService:
źródło
Według OAUTH 2.0:
W tym przypadku wystąpi problem z uwierzytelnianiem, ponieważ FCM używa teraz OAUTH 2
Czytam więc dokumentację bazy ogniowej i zgodnie z dokumentacją nowy sposób przesyłania wiadomości to:
Nagłówki
Aut
Przykład Ciała
W adresie URL znajduje się identyfikator bazy danych, który można znaleźć w konsoli bazy ognia. (Przejdź do ustawień projektu)
A teraz weźmy nasz token (będzie ważny tylko 1 godzinę):
Najpierw w konsoli Firebase otwórz Ustawienia> Konta usług . Kliknij opcję Generuj nowy klucz prywatny , aby bezpiecznie zapisać plik JSON zawierający klucz. Potrzebowałem tego pliku JSON, aby ręcznie autoryzować żądania serwera. Pobrałem to.
Następnie tworzę projekt node.js i użyłem tej funkcji, aby uzyskać mój token;
Teraz mogę użyć tego tokena w mojej prośbie o wpis. Następnie wysyłam wiadomość z danymi, która jest teraz obsługiwana przez moje aplikacje w funkcjiMessageReceived.
źródło
Od 2019 roku Google Firebase ma dużą zmianę w interfejsach API. Mam na myśli:
'com.google.firebase:firebase-messaging:18.0.0'
w 18.0.0 usunęli
MyFirebaseInstanceIDService
i musisz zdobyć token,MyFirebaseMessagingService
więc wystarczy napisać:a także w pliku AndroidManifest.xml musisz usunąć:
Ponadto zaleca się ustawienie wartości domyślnych w celu dostosowania wyglądu powiadomień. Możesz określić niestandardową domyślną ikonę i niestandardowy domyślny kolor, które będą stosowane, gdy równoważne wartości nie zostaną ustawione w ładunku powiadomienia.
Dodaj następujące wiersze do znacznika aplikacji, aby ustawić niestandardową domyślną ikonę i niestandardowy kolor:
teraz, aby obsługiwać powiadomienia w aplikacji działającej w tle, powinieneś zdefiniować zamiar w pierwszej aktywności, nawet jeśli jest to SplashScreen. Gdy aplikacja jest w tle, Android kieruje komunikaty powiadomień do paska zadań. Stuknięcie powiadomienia przez użytkownika domyślnie otwiera program uruchamiający aplikacje.
na przykład, jeśli twój Json jest taki:
wystarczy napisać prosty zamiar, aby uzyskać te wartości:
źródło
Oprócz powyższych odpowiedzi, w przypadku testowania powiadomień wypychanych za pomocą konsoli FCM klucz i obiekt „dane” nie są dodawane do pakietu powiadomień wypychanych. Nie otrzymasz więc szczegółowego powiadomienia push, gdy aplikacja jest w tle lub zostanie zabita.
W takim przypadku musisz wybrać konsolę administracyjną zaplecza, aby przetestować scenariusz aplikacji w tle.
Tutaj dodasz klucz „data” do pakietu push. więc szczegółowe informacje będą wyświetlane zgodnie z oczekiwaniami. Mam nadzieję, że to pomoże niewielu.
źródło
Za pomocą tego kodu możesz uzyskać powiadomienie w tle / na pierwszym planie, a także wykonać akcję:
W aplikacji użyj tego kodu:
źródło
Będą dwa rodzaje powiadomień
Musisz użyć Powiadomień danych, aby obsłużyć powiadomienie, gdy aplikacja działa w tle.
źródło
Wystąpił ten sam problem i ponownie skompilowałem bibliotekę firebase i uniemożliwiłem wysyłanie powiadomień, gdy aplikacja jest w tle
* biblioteka https://github.com/erdalceylan/com-google-firebase-messaging
*
nadzieja pomaga. Powodzenia
źródło