Jak obsługiwać powiadomienia, gdy aplikacja w tle w Firebase
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 pojawia się Powiadomienie, pojawia się domyślne powiadomienie i nie uruchamia mojego kodu onMessageReceived
.
// [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]
21 answers
1. Dlaczego to się dzieje?
W FCM (Firebase Cloud Messaging) występują dwa rodzaje wiadomości:]}-
Wyświetlanie wiadomości: te wiadomości wywołują callback
onMessageReceived()
tylko wtedy, gdy aplikacja znajduje się na pierwszym planie -
Wiadomości danych: wiadomości te wywołują
onMessageReceived()
callback nawet jeśli Twoja aplikacja jest w na pierwszym planie/tle / zabitym
Zespół Firebase nie opracował interfejsu użytkownika, aby wysłać {[5] } do twojego Urządzenia, jeszcze.
2. Jak?
Aby to osiągnąć, musisz wykonać POST
żądanie na następujący adres URL:
Nagłówki
-
Klucz:
Content-Type
, Wartość:application/json
-
Klucz:
Authorization
, Wartość:key=<your-server-key>
Body using topics
{
"to": "/topics/my_topic",
"data": {
"my_custom_key": "my_custom_value",
"my_custom_key2": true
}
}
Lub jeśli chcesz wysłać go do konkretnego urządzenia
{
"data": {
"my_custom_key": "my_custom_value",
"my_custom_key2": true
},
"registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}
Uwaga: upewnij się, że Nie dodajesz klucza JSON
notification
Uwaga: aby uzyskać klucz serwera, możesz go znaleźć w konsoli firebase:Your project -> settings -> Project settings -> Cloud messaging -> Server Key
3. Jak obsługiwać wiadomość push notification?
Tak postępujesz z otrzymaną wiadomością:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
String myCustomKey = data.get("my_custom_key");
// Manage data
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 11:38:27
Aby Biblioteka firebase wywołała twoje onmessagerecained () w następujących przypadkach
- Aplikacja na pierwszym planie
- Aplikacja w tle
- Aplikacja została zabita
NIE WOLNO umieszczać klucza JSON 'notification' w zapytaniu do API firebase, ale zamiast tego używać 'data', patrz poniżej.
Poniższy komunikat nie wywoła onmessagerecaired () Gdy twoja aplikacja jest w tle lub zabita, a nie możesz dostosować swojego powiadomienie.
{
"to": "/topics/journal",
"notification": {
"title" : "title",
"text": "data!",
"icon": "ic_notification"
}
}
Ale zamiast tego użycie tego zadziała
{
"to": "/topics/dev_journal",
"data": {
"text":"text",
"title":"",
"line1":"Journal",
"line2":"刊物"
}
}
Zasadniczo wiadomość jest wysyłana w argumencie RemoteMessage wraz z obiektem danych jako mapą, a następnie możesz zarządzać powiadomieniem w onmessagerec received jak w fragmencie tutaj
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
//you can get your text message here.
String text= data.get("text");
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
// optional, this is to make beautiful icon
.setLargeIcon(BitmapFactory.decodeResource(
getResources(), R.mipmap.ic_launcher))
.setSmallIcon(smallIcon) //mandatory
.......
/*You can read more on notification here:
https://developer.android.com/training/notify-user/build-notification.html
https://www.youtube.com/watch?v=-iog_fmm6mE
*/
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:29:32
Czuję, że wszystkie odpowiedzi są niekompletne, ale wszystkie z nich mają coś, czego potrzebujesz do przetworzenia powiadomienia, które mają DANE, gdy aplikacja jest w tle.
Wykonaj te kroki, a będziesz mógł przetwarzać powiadomienia, gdy aplikacja jest w tle.
1.Dodaj filtr intencyjny w ten sposób:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name=".MainActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Do działania, które chcesz przetworzyć dane powiadomienia.
-
Wysyłanie powiadomień z następnym format:
{ "notification" : { "click_action" : ".MainActivity", "body" : "new Symulti update !", "title" : "new Symulti update !", "icon" : "ic_notif_symulti" }, "data": { ... }, "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }
Kluczem tutaj jest add
"click_action" : ".MainActivity"
Gdzie .MainActivity to aktywność z filtrem intencyjnym dodanym w kroku 1.
-
Pobierz" dane " informacje z powiadomienia w onCreate z ".Główna": {]}
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //get notification data info Bundle bundle = getIntent().getExtras(); if (bundle != null) { //bundle must contain all info sent in "data" field of the notification } }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:35:26
Zgodnie z docs
Obsługa wiadomości w aplikacji
Gdy aplikacja jest w tle, Android kieruje powiadomienia Wiadomości do zasobnika systemowego. Dotknięcie przez użytkownika powiadomienia otwiera domyślnie uruchamianie aplikacji.
Obejmuje to wiadomości, które zawierają zarówno powiadomienie, jak i dane ładunek. W takich przypadkach powiadomienie jest dostarczane do urządzenia zasobnika systemowego, a dane są dostarczane w dodatkach cel działania wyrzutni.
Jeśli chcesz otworzyć aplikację i wykonać określoną akcję, Ustaw click_action w powiadomieniu i mapowanie go w celu filtruj aktywność, którą chcesz uruchomić. Na przykład zestaw click_action to OPEN_ACTIVITY_1 to trigger an intent filter like the "following": {]}
<intent-filter> <action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Edit:
Na podstawie tego wątku :
Nie można ustawić ładunku click_action za pomocą konsoli Firebase. Możesz spróbować przetestować z poleceniem curl lub niestandardowym serwerem http
curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>"
--header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send
-d "{\"to\":\"/topics/news\",\"notification\":
{\"title\": \"Click Action Message\",\"text\": \"Sample message\",
\"click_action\":\"OPEN_ACTIVITY_1\"}}"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:37:18
Zgodnie z dokumentacją firebase w wysyłamy za pomocą firebase , istnieje 2 typ ładunku:
-
Dane
Ten parametr określa niestandardowe pary klucz-wartość ładunku wiadomości. Aplikacja kliencka jest odpowiedzialna za przetwarzanie wiadomości danych. Wiadomości danych mają tylko niestandardowe pary klucz-wartość.
-
Notification
Parametr ten określa predefiniowany, widoczny przez użytkownika pary klucz-wartość ładunku powiadomienia. FCM automatycznie wyświetla komunikat na urządzeniach użytkowników końcowych w imieniu aplikacji klienckiej. Wiadomości powiadomień mają predefiniowany zestaw widocznych przez użytkownika kluczy.
Gdy jesteś na pierwszym planie, możesz pobrać dane z FCM za pomocą onmessagerecaired () , możesz pobrać dane z data.
data = remoteMessage.getData();
String customData = (String) data.get("customData");
Gdy jesteś w tle, FCM wyświetli powiadomienie w zasobniku systemowym na podstawie informacji z zawiadomienie Tytuł, wiadomość i ikona, które są używane do powiadomienia na pasku zadań, są pobierane z ładunku notification.
{
"notification": {
"title" : "title",
"body" : "body text",
"icon" : "ic_notification"
}
}
This notification payload są używane, gdy chcesz automatycznie wyświetlać powiadomienia na pasku zadań, gdy aplikacja jest w tle. Aby uzyskać dane powiadomień, gdy aplikacja jest w tle, należy dodać click_action wewnątrz notification payload.
Jeśli chcesz otworzyć Twoja aplikacja i wykonaj określone działanie [w tle], Ustaw click_action w ładunku powiadomień i Mapuj je do filtra intencyjnego w aktywności, którą chcesz uruchomić. Na przykład ustaw click_action na open_activity_1, aby uruchomić filtr intencyjny, taki jak:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Umieść ten filtr intencji w manifeście, wewnątrz znacznika aplikacji. Po kliknięciu powiadomienia otworzy się aplikacja i przejdzie od razu do aktywności zdefiniowanej w click_action, w tym przypadku "OPEN_ACTIVTY_1". A wewnątrz tej aktywności można uzyskać dane przez:
Bundle b = getIntent().getExtras();
String someData = b.getString("someData");
Używam FCM dla mojej aplikacji na Androida i używam obu ładunków. Oto przykład JSON, którego używam:
{
"to": "FCM registration ID",
"notification": {
"title" : "title",
"body" : "body text",
"icon" : "ic_notification"
},
"data": {
"someData" : "This is some data",
"someData2" : "etc"
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-25 15:32:04
Ponieważ display-messages
, które są wysyłane z Firebase Notification UI działa tylko wtedy, gdy aplikacja jest na pierwszym planie. Dla data-messages
istnieje potrzeba wykonania połączenia pocztowego do FCM
Kroki
-
Dodaj następujące nagłówki
Key: Content-Type, Value : application / json
-
Dodaj ciało
-
Jeśli używasz tematów:
{ "to" : "/topics/topic_name", "data": { "key1" : "value1", "key2" : "value2", } }
-
Jeśli używasz identyfikatora rejestracji:
{ "registration_ids" : "[{"id"},{id1}]", "data": { "key1" : "value1", "key2" : "value2", } }
-
To jest to!. Teraz posłuchaj onMessageReceived
callback jak zwykle.
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
String value1 = data.get("key1");
String value2 = data.get("key2");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 10:04:30
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
}
Nie jest wywoływana za każdym razem, gdy jest wywoływana tylko wtedy, gdy aplikacja jest w forground
Istnieje jedna metoda nadpisywania ta metoda jest wywoływana za każdym razem, bez względu na to, jaka aplikacja jest na pierwszym planie, w tle lub zabita, ale ta metoda jest dostępna z tą wersją firebase api
To jest wersja, którą musisz zaimportować z gradle
compile 'com.google.firebase:firebase-messaging:10.2.1'
Jest to metoda
@Override
public void handleIntent(Intent intent) {
super.handleIntent(intent);
// you can get ur data here
//intent.getExtras().get("your_data_key")
}
W poprzednim firebase api tej metody nie było więc w takim przypadku fire base obsługuje się, 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, domyślna aktywność zostanie uruchomiona w takim przypadku u można uzyskać dane w ten sam sposób
if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();
// do what ever u want .... }
Ogólnie taką strukturę z serwera otrzymujemy w powiadomieniu
{
"notification": {
"body": "Cool offers. Get them before expiring!",
"title": "Flat 80% discount",
"icon": "appicon",
"click_action": "activity name" //optional if required.....
},
"data": {
"product_id": 11,
"product_details": "details.....",
"other_info": "......."
}
}
To zależy od tego, jak chcesz dać ten klucz danych lub chcesz dać powiadomienie, cokolwiek możesz dać ....... what ever u will daj tutaj z tym samym kluczem u dostanie te dane .........
Istnieje kilka przypadków, jeśli u r Nie wysyłanie akcji kliknięcia w tym przypadku, gdy u kliknie na powiadomieniu domyślna aktywność zostanie otwarta, ale jeśli chcesz otworzyć określoną aktywność, gdy aplikacja jest w tle, u można wywołać aktywność z tej metody handleIntent, ponieważ jest ona wywoływana za każdym razem
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:41:02
Aby uchwycić wiadomość w tle, musisz użyć BroadcastReceiver
public class FirebaseDataReceiver extends WakefulBroadcastReceiver {
private final String TAG = "FirebaseDataReceiver";
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "I'm in!!!");
Bundle dataBundle = intent.getBundleExtra("data");
Log.d(TAG, dataBundle.toString());
}
}
I dodaj to do manifestu:
<receiver
android:name="MY_PACKAGE_NAME.FirebaseDataReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</receiver>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 10:08:16
Oto bardziej jasne pojęcia dotyczące wiadomości firebase. Znalazłem to od ich zespołu wsparcia.
Firebase posiada trzy typy wiadomości :
Powiadomienia : powiadomienia działają w tle lub na pierwszym planie. Gdy aplikacja jest w tle, powiadomienia są dostarczane do zasobnika systemowego. Jeśli aplikacja znajduje się na pierwszym planie, wiadomości są obsługiwane przez wywołania zwrotne onMessageReceived()
lub didReceiveRemoteNotification
. Są to zasadniczo to, co nazywa się wyświetlaczem wiadomości.
Wiadomości danych: na platformie Android Wiadomości danych mogą działać w tle i na pierwszym planie. Wiadomość z danymi będzie obsługiwana przez onmessagerec received (). Uwaga dotycząca platformy brzmiałaby: na Androidzie ładunek danych można pobrać w intencji użytej do uruchomienia aktywności. Aby rozwinąć, jeśli masz "click_action":"launch_Activity_1"
, możesz pobrać tę intencję przez getIntent()
z only Activity_1
.
Wiadomości z powiadomieniami i danymi: gdy w tle, aplikacje otrzymują ładunek powiadomienia w zasobniku powiadomień i obsługują ładunek danych tylko wtedy, gdy użytkownik dotknie powiadomienia. Na pierwszym planie aplikacja otrzymuje obiekt wiadomości z dostępnymi obydwoma ładunkami. Po drugie, parametr click_action
jest często używany w ładunku powiadomień, a nie w ładunku danych. Jeśli zostanie użyty wewnątrz ładunku danych, parametr ten będzie traktowany jako niestandardowa para klucz-wartość i dlatego trzeba będzie zaimplementować niestandardową logikę, aby działał jako zamierzony.
Zalecam również użycie metody onMessageReceived
(Zobacz wiadomość z danymi) do wyodrębnienia pakietu danych. Z Twojej logiki sprawdziłem obiekt bundle i nie znalazłem oczekiwanej zawartości danych. Tutaj jest odniesienie do podobnego przypadku, który może zapewnić większą jasność.
Po Więcej informacji odwiedź mój ten wątek
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 20:29:47
Według dokumentów: 17 maja 2017
Gdy twoja aplikacja jest w tle , Android kieruje wiadomości powiadomień do zasobnika systemowego. Dotknij użytkownika na powiadomienie otwiera App launcher domyślnie .
Obejmuje to wiadomości zawierające zarówno powiadomienie, jak i dane (oraz wszystkie wiadomości wysyłane z konsoli powiadomień). W tych przypadki, powiadomienie jest dostarczane do zasobnika systemowego urządzenia, oraz dane ładunek jest dostarczany w dodatkach z intencji twojego aktywność wyrzutni.
Więc powinieneś użyć obu powiadomień o ładunku + danych:
{
"to": "FCM registration ID",
"notification": {
"title" : "title",
"body" : "body text",
"icon" : "ic_notification"
},
"data": {
"someData" : "This is some data",
"someData2" : "etc"
}
}
Nie ma potrzeby używania click_action.Należy po prostu pobrać exras z intent on Launcher activity
<activity android:name=".MainActivity">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Kod Javy powinien być na metodzie OnCreate na MainActivity:
Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
Bundle extras = intent.getExtras();
String someData= extras.getString("someData");
String someData2 = extras.getString("someData2");
}
Możesz przetestować oba powiadomienia o ładunku + dane z Firebase Notifications Console . Nie zapomnij wypełnić niestandardowe pola danych w sekcji Opcje zaawansowane
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:42:30
Rozgryzłem scenariusze,
Gdy aplikacja jest na pierwszym planie , metoda onmessagerecaired() jest wywoływana z FirebaseService. tak więc zostanie wywołana pendingIntent zdefiniowana w klasie service.
I gdy aplikacja jest w tle , pierwsza aktywność jest wywoływana.
Teraz, jeśli użyjesz Splash activity , to musi pamiętać o wywołaniusplashactivity , w przeciwnym razie jeśli nie ma splashActivity, wtedy niezależnie od pierwszej aktywności, będzie nazywany.
Następnie należy sprawdzićgetIntent () zfirst activity , aby sprawdzić, czy ma ona jakiśpakiet .jeśli wszystko jest w porządku, zobaczysz, że pakiet jest tam z wypełnionymi wartościami. Jeśli wartość w znaczniku danych wysłanym z serwera wygląda tak,
"data": {
"user_name": "arefin sajib",
"value": "user name notification"
}
Wtedy w pierwszym ćwiczeniu zobaczysz, istnieje valid intent (getIntent () nie jest null ), valid bundle i inside bundle , będzie cały wspomniany wyżej JSON z danymi jako klucz.
W tym scenariuszu kod do ekstrakcji wartości będzie wyglądał tak,
if(getIntent()!=null){
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
try {
JSONObject object = new JSONObject(bundle.getStringExtra("data"));
String user_name = object.optString("user_name");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 04:55:38
Proste podsumowanie jak to
-
Jeśli Twoja aplikacja jest uruchomiona;
onMessageReceived()
Jest wyzwalaczem.
-
Jeśli Twoja aplikacja nie działa (zabita przez przesuwanie);
onMessageReceived()
Nie jest uruchamiany i dostarczany przez direclty. Jeśli masz jakąś specjalną parę klucz-wartość. Nie działają, ponieważ onmessagerec received () nie działa.
I' ve found this way;
W swojej aktywności launcher, umieścić tę logikę,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.activity_splash);
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {
// do what you want
// and this for killing app if we dont want to start
android.os.Process.killProcess(android.os.Process.myPid());
} else {
//continue to app
}
}
In this if block, wyszukaj klucze zgodnie z interfejsem firebase.
W tym przykładzie mój klucz i wartość jak wyżej; (sorry za język =))
Kiedy mój kod działa, dostaję " com.rda.Uwaga".android.os.Process.killProcess(android.os.Process.myPid());
Z tej linii kodu, zamknąłem moją aplikację i otworzyć Google Play Market
Happy coding =)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-19 11:26:19
Usuń notification payload całkowicie z żądania serwera. Wyślij tylko DANE i obsłuż je w onMessageReceived()
, w przeciwnym razie twoje onMessageReceived
nie zostanie uruchomione, gdy aplikacja jest w tle lub zabita.
Oto co wysyłam z serwera:
{
"data":{
"id": 1,
"missedRequests": 5
"addAnyDataHere": 123
},
"to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}
Więc możesz odbierać swoje dane w onMessageReceived(RemoteMessage message)
w następujący sposób: (powiedzmy, że muszę uzyskać identyfikator)
Object obj = message.getData().get("id");
if (obj != null) {
int id = Integer.valueOf(obj.toString());
}
I podobnie możesz uzyskać dowolne dane, które wysłałeś z serwera w onMessageReceived()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-17 11:59:44
Łatwy sposób wysyłania wiadomości, nawet jeśli aplikacja jest w tle i na pierwszym planie, jak następuje:- Aby wysłać wiadomość za pomocą API, można użyć narzędzia o nazwie AdvancedREST Client, jego rozszerzenie chrome, i wysłać wiadomość z następującymi parametrami.
Rest client tool 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 Authorization: key=Your Server key From or authoization key (patrz niżej ref)
{ "data": {
"image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
"message": "Firebase Push Message Using API"
"AnotherActivity": "True"
},
"to" : "device id Or Device token"
}
Klucz autoryzacyjny można uzyskać, odwiedzając konsolę programistów Google i klikając przycisk poświadczenia w lewym menu dla swojego projektu. Wśród wymienionych kluczy API klucz serwera będzie Twoim kluczem autoryzacyjnym.
I musisz umieścić tokenID odbiornika w sekcji " do " twojego żądania POST wysłanego za pomocą API.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:43:45
Dziękuję wszystkim za odpowiedzi. Ale rozwiązałem to wysyłając wiadomość z danymizamiast wysyłania powiadomienia. Kod serwera
<?php
$url = "https://fcm.googleapis.com/fcm/send";
$token = "C-l6T_a7HouUK****";
$serverKey = "AAAAaOcKS00:********";
define( 'API_ACCESS_KEY', $serverKey );
$registrationIds = array($token);
// prep the bundle
$msg = array
(
'message' => 'here is a message. message',
'title' => 'This is a title. title',
'subtitle' => 'This is a subtitle. subtitle',
'tickerText' => 'Ticker text here...Ticker text here...Ticker text
here',
'vibrate' => 1,
'sound' => 1,
'largeIcon' => 'large_icon',
'smallIcon' => 'small_icon'
);
$fields = array
(
'registration_ids' => $registrationIds,
'data' => $msg
);
$headers = array
(
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send'
);
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
echo $result;
?>
i przechwycił dane w onmessagerec received
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
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());
sendNotification(remoteMessage.getData().get("message"));
}
// Check if message contains a notification payload.
else if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getNotification().getBody());
}
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
String channelId = "idddd";
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(MyFirebaseMessagingService.this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("FCM Message")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 12:09:54
Czerwiec 2018 Odpowiedź-
Musisz upewnić się, że nigdzie w wiadomości nie ma słowa kluczowego "powiadomienie". Dołącz tylko "dane", a aplikacja będzie w stanie obsłużyć wiadomość w onmessagerec received, nawet jeśli w tle lub zabity.
Korzystanie Z Funkcji Chmury:
const message = {
token: token_id, // obtain device token id by querying data in firebase
data: {
title: "my_custom_title",
body: "my_custom_body_message"
}
}
return admin.messaging().send(message).then(response => {
// handle response
});
Następnie w onmessagerec (), w klasie rozszerzającej com.google.baza ogniowa.wiadomości.FirebaseMessagingService:
if (data != null) {
Log.d(TAG, "data title is: " + data.get("title");
Log.d(TAG, "data body is: " + data.get("body");
}
// build notification using the body, title, and whatever else you want.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 03:29:48
Za pomocą tego kodu można uzyskać powiadomienie w tle/na pierwszym planie, a także umieścić akcję:
//Data should come in this format from the notification
{
"to": "/xyz/Notifications",
"data": {
"key1": "title notification",
"key2": "description notification"
}
}
W aplikacji Użyj tego kodu:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
String key1Data = remoteMessage.getData().get("key1");
// use key1Data to according to your need
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 07:58:00
Chcesz pracować onmessagerecaired (RemoteMessage remoteMessage) w tle wysyłać tylko dane część powiadomienia część to:
"data": "image": "", "message": "Firebase Push Message Using API",
"another activity": "True", "to": "device id Or Device token"
Przez ten onMessageRecivied jest tłem wywołania i pierwszym planie nie trzeba obsługiwać powiadomienia za pomocą tray powiadomień o aktywności launchera.
Obsługa ładunku danych przy użyciu tego:
Public void onMessageReceived (RemoteMessage remoteMessage)
jeśli (remoteMessage.getData ().rozmiar() > 0)
Log.d (TAG, "Message data payload:" + remoteMessage.getData());
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 09:36:20
Oprócz powyższych odpowiedzi, Jeśli testujesz powiadomienia push za pomocą FCM console, klucz "data" i obiekt są dodane do pakietu powiadomień Push , a nie. Więc nie otrzymasz szczegółowych powiadomień push, gdy aplikacja jest w tle lub zabity.
W tym przypadku musisz wybrać konsolę administratora zaplecza, aby przetestować scenariusz w tle aplikacji.
Tutaj dodasz klucz "data" do swojego pakietu push. tak więc szczegółowe naciśnięcie zostanie pokazane zgodnie z oczekiwaniami. Mam nadzieję, że to pomoże kilka.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-27 17:29:03
Doświadczyłem tego samego problemu i przekompilowałem bibliotekę firebase i uniemożliwiłem jej wysyłanie powiadomień, gdy aplikacja jest w tle
*biblioteka https://github.com/erdalceylan/com-google-firebase-messaging
dependencies {
compile 'com.google.firebase:firebase-core:11.2.0'
compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
}
*
@WorkerThread
public void onMessageReceived(RemoteMessage var1) {
//your app is in background or foreground all time calling
}
Nadzieja pomaga. PowodzeniaWarning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 07:29:55