Firebase'de arka planda uygulama olduğunda bildirim nasıl işlenir


427

İşte tezahürüm

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

Uygulama arka planda olduğunda ve bildirim geldiğinde varsayılan bildirim gelir ve kodumu çalıştırmaz onMessageReceived.

İşte onMessageReceivedkodum. Bu, uygulamam arka planda çalışırken değil, uygulamam ön planda çalışıyorsa çağrılır. Uygulama arka planda da olduğunda bu kod nasıl çalıştırılır?

// [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]

1
İkinci yorum satırı, onMessageReceived () ' in geçersiz kılma örneğinde yazılmıştır Not getting messages here? See why this may be: goo.gl/39bRNJ . Çözüm, aşağıdaki yanıtlar gibi, hem bildirim hem de veri yükü içeren Mesajlar'daki
fllo

Kısaca konuşursak, öldürülen uygulamanızı uyandırmak için, her zaman veri nesnesi ile bildirimde bulunarak bildirim servis sınıfı işleyicinizi FirebaseMessagingService.onMessageReceived () uygulamanızda çağırmanız gerekir. Ayrıca Firebase konsolundan göndermeyi değil, başka bir yerden göndermeyi deneyin (örneğin, çevrimiçi test sonrası hizmeti).
Zon

1
Bu çözüm benim için çalıştı stackoverflow.com/a/44150822/6632278 umut yardımcı olur. İyi şanslar
Tony Barajas

ne ".fcm." PshycoFirebaseMessagingServices manifestinizde mi? Sınıf bulunamadı hatası alıyorum .. ve parametrenin bu ilk kısmı nedir hiçbir yerde bulamadım.
Éder Rocha Bezerra

Yanıtlar:


661

1. Bu neden oluyor?

FCM'de iki tür mesaj vardır (Firebase Cloud Messaging):

  1. Ekran Mesajları : Bu mesajlar onMessageReceived()yalnızca uygulamanız ön planda olduğunda geri aramayı tetikler
  2. Veri Mesajları : Bu mesajlar , uygulamanız ön planda / arka planda / öldürülmüş olsa bileonMessageReceived() geri aramayı tetikler

NOT: Firebase ekibi data-messageshenüz cihazlarınıza göndermek için bir kullanıcı arayüzü geliştirmedi . Sunucunuzu bu tür gönderme için kullanmalısınız!



2. Nasıl?

Bunu başarmak POSTiçin aşağıdaki URL'ye bir istekte bulunmanız gerekir :

POST https://fcm.googleapis.com/fcm/send

Başlıkları

  • Anahtar: Content-Type , Değer: application/json
  • Anahtar: Authorization , Değer: key=<your-server-key>

Konuları kullanan gövde

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

Veya belirli cihazlara göndermek istiyorsanız

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}


NOT: Eğer emin olun ekleyerek değil JSON anahtar notification
: NOT Eğer Firebase konsolunda bulabilirsiniz, sunucu anahtarı almak için:Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. Push bildirim mesajı nasıl işlenir?

Alınan mesajı şu şekilde işlersiniz:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}

4
Bu adımları izleyerek "veri" ve "bildirim" anahtarlarını aynı bildirimde gönderebilirsiniz stackoverflow.com/a/42279260/2734021 :)
Daniel S.

15
Firebase team have not developed a UI to send data-messages to your devices, yet.Bu geçen yıl değişti mi?
Hankrecords

2
@Antonio Uygulama öldürüldüğünde oreo'da, onMessageReceived çağrılmaz. sadece veri ile yük var. herhangi bir güncellemen var mı?
Samir Mangroliya

63
Uygulama arka planda onMessageReceivedolduğunda çağrılmaz ve FCM ciddi bir sorun !!! Ayrıca lütfen cevabınızı güncelleyin.
Muhammed Babar

2
Benim için, bu bazı android cihazlarda oluyor gibi görünüyor. Bunun gerçek bir sorun olduğunu düşünerek saatler harcadık, ama sonra hiçbir şey olmadığı ortaya çıktı. Bu yüzden tavsiyem farklı cihazlarda test etmektir. Hatta bir VM üzerinde test ettim ve uygulama öldürüldüğünde bile bildirimi aldım. Bunu sadece birinin zamanından tasarruf etmek için söylüyorum.
Tarek-Dev

158

Firebase kitaplığını aşağıdaki durumlarda onMessageReceived () yönteminizi çağıracak şekilde yapmak için

  1. Uygulama ön planda
  2. Arka planda uygulama
  3. Uygulama öldürüldü

Firebase API'sı isteğinize JSON anahtarı 'bildirim' koymamalı, bunun yerine 'veri' kullanmalısınız, aşağıya bakın.

Aşağıdaki mesaj, uygulamanız arka planda veya öldürüldüğünde onMessageReceived () öğenizi çağırmaz ve bildiriminizi özelleştiremezsiniz.

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

ama bunun yerine bunu kullanmak işe yarayacak

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

Temel olarak, mesaj RemoteMessage bağımsız değişkeninde harita olarak veri nesnenizle birlikte gönderilir, ardından onipletteBuived'de bildirimi burada snippet'te olduğu gibi yönetebilirsiniz.

@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
    */
}

1
Bunu Firebase konsolundan başarmak mümkün mü?
koder

@koder, maalesef Firebase konsolu bunu desteklemiyor, bukle veya postacı (krom eklentisi), firebase mesajlaşma api gibi firebase'e mesaj mesajı isteği göndermek için aracı kullanmanız gerekiyor - firebase.google.com/docs / cloud-messaging / http-server-ref
Teerakiat Chitawattanarat

1
Bu bir günden fazla bir süredir aradığım şeydi ..... Mükemmel çalıştığı için çok teşekkür ederim. ve bu değerlerle bir etkinlik başlatmak için verilerdeki anahtar vale çiftlerinin onMessageReceived () içinde nasıl ele alınabileceğini açıklarsak daha iyi olur.
Boopathi T

25
Uygulama arka planda olduğunda yönteminiz iyi çalışıyor, ancak uygulama öldürüldüğünde veri
almıyorum

8
Aynı Sanzhar sorunu. Uygulama öldürülürse, herhangi bir mesaj almazsınız.
Giacomo M

104

Tüm yanıtların eksik olduğunu hissediyorum, ancak hepsinde uygulamanız arka planda olduğunda verileri olan bir bildirimi işlemek için ihtiyacınız olan bir şey var.

Bu adımları izleyin; uygulamanız arka planda olduğunda bildirimlerinizi işleyebilirsiniz.

1.Bunun gibi bir niyet filtresi ekleyin:

<activity android:name=".MainActivity">
      <intent-filter>
           <action android:name=".MainActivity" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>

bildirim verilerini işlemek istediğiniz bir etkinliğe.

  1. Sonraki biçime sahip bildirim gönderin:

    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }

Buradaki anahtar ekle

"click_action" : ".MainActivity"

Burada .AnaActivity, 1. adımda eklediğiniz niyet filtresine sahip etkinliktir.

  1. ".MainActivity" nin onCreate öğesindeki bildirimden "veri" bilgilerini alın:

    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
        }
    }

Ve tüm yapmanız gereken bu olmalı. Umarım bu birine yardımcı olur :)


5
Bu doğru cevap olmalı. Dokümanların hiçbiri, bildirimin tepside bile görünmesi için bir click_action VE Niyet Filtresi gerektirme hakkında hiçbir şey söylemez. İkisi de gereklidir.
airowe

@airowe bildirimin görünmesi için gerekli değildir
AlwaysConfused

Hem veri hem de bildirim bloklarım var ama etkinlikte veri alamıyorum?
Ashwani

3
Bunun kabul edilen cevap nasıl olmadığını anlamıyorum. Click_action olmadan, çalışmaz. Kaydedilen günümü
Arun Shankar

4
Desteğiniz için teşekkürler @ArunShankar. Kabul edilen cevap, benimkinden 7 ay önce cevaplandı ve bu iyi bir cevaptı. Neden kimse click_action hakkında konuşmuyor anlayamıyorum ve bu yüzden cevabımı ekledim. Birçok insan için çok faydalı olduğu için çok mutluyum ve günün sonunda önemli olan şey :)
Daniel S.

42

Firebase kullanarak aşağı akış gönderilmesinde kullanılan firebase belgelerine göre , 2 tür yük kapasitesi vardır:

  1. veri

    Bu parametre, mesajın faydalı yükünün özel anahtar / değer çiftlerini belirtir. Veri mesajlarının işlenmesinden müşteri uygulaması sorumludur. Veri mesajlarında yalnızca özel anahtar / değer çiftleri bulunur.

  2. bildirim

    Bu parametre, bildirim yükünün önceden tanımlanmış, kullanıcı tarafından görülebilir anahtar / değer çiftlerini belirtir. FCM, mesajı istemci uygulaması adına son kullanıcı cihazlarına otomatik olarak görüntüler. Bildirim mesajlarında önceden tanımlanmış kullanıcı tarafından görülebilir anahtarlar bulunur.

Ön planda olduğunuzda onMessageReceived () kullanarak FCM içindeki verileri alabilirsiniz, verilerinizi veri yükünden alabilirsiniz.

data = remoteMessage.getData();
String customData = (String) data.get("customData");

Arka planda olduğunuzda FCM, bildirim yükünden gelen bilgilere dayanarak sistem tepsisinde bildirim gösterir . Sistem tepsisindeki bildirim için kullanılan başlık, mesaj ve simge bildirim yükünden alınır.

{
  "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification",
        "click_action" : "OPEN_ACTIVITY_1"
       }
}

Bu bildirim yükü, uygulamanız arka planda olduğunda sistem tepsisinde otomatik olarak bildirim göstermek istediğinizde kullanılır. Arka planda uygulama, içinde click_action eklemek gerekir bildirim verilerini almak için bildirim yük.

Uygulamanızı açmak ve [arka plandayken] belirli bir işlem gerçekleştirmek istiyorsanız, bildirim yükünde click_action öğesini ayarlayın ve başlatmak istediğiniz Etkinlik'teki bir niyet filtresiyle eşleyin. Örneğin, aşağıdaki gibi bir niyet filtresi tetiklemek için click_action öğesini OPEN_ACTIVITY_1 olarak ayarlayın:

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Bu niyet filtresini bildirim etiketinize, etkinlik etiketinizden birinin içine yerleştirin. Bildirimi tıkladığınızda, uygulama açılır ve doğrudan click_action'da tanımladığınız etkinliğe, bu durumda "OPEN_ACTIVTY_1" a gider. Ve bu aktivitenin içinde verileri aşağıdaki yollarla alabilirsiniz:

Bundle b = getIntent().getExtras();
String someData = b.getString("someData");

Android uygulamam için FCM kullanıyorum ve her iki yükü de kullanıyorum. İşte kullanıyorum örnek JSON:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification",
    "click_action" : "OPEN_ACTIVITY_1"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

"Bu niyet filtresini manifestinize, uygulama etiketinin içine koyun." uygulama filtresinin içine niyet filtresi koyamazsınız.
Kyrylo Zapylaiev

JSON hesaplarınız click_action anahtarının nereye gittiğini göstermez.
Josh

bu doğru cevap değil mi? tıklama eylemi nedir n nereye gider? bazıları oy aşağı veya temizlemek gerekir
rana

1
@KyryloZapylaiev Sadece cevabı düzeltiyorum ve güncelliyorum: "Bu niyet filtresini faaliyet etiketinizden birinin içine manifestinize koyun".
Dika

1
@Josh güncellendi ve biçimlendirildi. tekrar kontrol edebilirsiniz
Dika

32

Dokümanlara göre

İletileri arka plandaki bir uygulamada işleme

Uygulamanız arka planda olduğunda, Android bildirim mesajlarını sistem tepsisine yönlendirir. Bildirime bir kullanıcı dokunması varsayılan olarak uygulama başlatıcıyı açar.

Bu, hem bildirim hem de veri yükü içeren iletileri içerir. Bu durumlarda, bildirim cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında teslim edilir.

Uygulamanızı açmak ve belirli bir işlem gerçekleştirmek istiyorsanız, bildirim bilgi yükünde click_action öğesini ayarlayın ve başlatmak istediğiniz Etkinlik'te bir niyet filtresiyle eşleyin. Örneğin, aşağıdaki gibi bir niyet filtresi tetiklemek için click_action öğesini OPEN_ACTIVITY_1 olarak ayarlayın:

 <intent-filter>   <action android:name="OPEN_ACTIVITY_1" />  
 <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

Düzenle :

Bu konuya dayanarak :

Firebase Konsolu'nu kullanarak click_action yükünü ayarlayamazsınız. Bir curl komutu veya özel bir http sunucusu ile test etmeyi deneyebilirsiniz

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\"}}"

1
Haklısın. belgeleri okudum. ama bunu manifestoma nereye koyacağımı kafam karıştı? i ne yapmak zorunda efendim ki bu java dosyasında onMessageReceived kodu çalıştırmak zorunda?
Parth Patel

Uygulamanın arka planda olduğunda otomatik olarak onMessageReveiced çağrısı yapamazsınız. Bunun yerine, alınan amacı ele almanız ve işleyicinin aramasını sağlamanız gerekir. Ya da muhtemelen hem onMessageReveiced hem de niyet işlemeniz tarafından çağrılan ayrı bir sınıf / yöntem uygulamak en iyisidir. Ana faaliyetin onNewIntent'ine işleyici ekledim ve benim için iyi çalışıyor.
diidu

@Parath Patel sorularına cevap vermek için çok geç, ama belki de bu aynı sorunları olan başka birine yardımcı olacak, cevabımı burada bulabilirsiniz. stackoverflow.com/a/42279260/2734021
Daniel S.

bu eylemi nereye koymak zorunda kaldı? veya Firebasemessage hizmetim için?
Mehdi

** çoklu bildirim yönlendirmesi çalışmıyor? Örneğin: "click_action" kullanarak ilk bildirimde başarılı bir şekilde yeniden yönlendirilen fcm'den üç bildirimim varsa ve ardından 2 bildirimde tıklayıp etkinlik yönlendirmesi çalışmıyor
prasanthMurugan

24

Temmuz 2019 itibariyle çalışıyor

Android derlemesiSdkVersion 28, buildToolsVersion 28.0.3 ve firebase-mesajlaşma: 19.0.1

Diğer StackOverflow soruları ve cevapları boyunca uzun saatler boyunca araştırma yaptıktan ve sayısız eski çözümleri denedikten sonra, bu çözüm aşağıdaki 3 senaryoda bildirim göstermeyi başardı:

- Uygulama ön planda:
bildirim MyFirebaseMessagingService sınıfımdaki onMessageReceived yöntemi tarafından alındı

- Uygulama öldürüldü (arka planda çalışmıyor): bildirim FCM tarafından otomatik olarak bildirim tepsisine gönderilir. Kullanıcı bildirime dokunduğunda uygulama, manifest'te android.intent.category.LAUNCHER olan etkinliği çağırarak başlatılır. OnCreate () yönteminde getIntent (). GetExtras () yöntemini kullanarak bildirimin veri kısmını alabilirsiniz.

- Uygulama arka planda: bildirim FCM tarafından otomatik olarak bildirim tepsisine gönderilir. Kullanıcı bildirime dokunduğunda uygulama manifest'te android.intent.category.LAUNCHER olan etkinliği başlatarak ön plana çıkarılır. Uygulamam bu aktivitede launchMode = "singleTop" içerdiğinden, aynı sınıfın bir etkinliği zaten oluşturulduğundan onCreate () yöntemi çağrılmaz, bunun yerine o sınıfın onNewIntent () yöntemi çağrılır ve intent.getExtras () kullanarak bildirimde bulunun.

Adımlar: 1- Uygulamanızın ana etkinliğini şu şekilde tanımlarsanız:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:screenOrientation="portrait"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name=".MainActivity" />
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

2- bu satırları MainActivity.class'ınızın onCreate () yöntemine ekleyin

Intent i = getIntent();
Bundle extras = i.getExtras();
if (extras != null) {
    for (String key : extras.keySet()) {
        Object value = extras.get(key);
        Log.d(Application.APPTAG, "Extras received at onCreate:  Key: " + key + " Value: " + value);
    }
    String title = extras.getString("title");
    String message = extras.getString("body");
    if (message!=null && message.length()>0) {
        getIntent().removeExtra("body");
        showNotificationInADialog(title, message);
    }
}

ve bu yöntemleri aynı MainActivity.class için:

@Override
public void onNewIntent(Intent intent){
    //called when a new intent for this class is created.
    // The main case is when the app was in background, a notification arrives to the tray, and the user touches the notification

    super.onNewIntent(intent);

    Log.d(Application.APPTAG, "onNewIntent - starting");
    Bundle extras = intent.getExtras();
    if (extras != null) {
        for (String key : extras.keySet()) {
            Object value = extras.get(key);
            Log.d(Application.APPTAG, "Extras received at onNewIntent:  Key: " + key + " Value: " + value);
        }
        String title = extras.getString("title");
        String message = extras.getString("body");
        if (message!=null && message.length()>0) {
            getIntent().removeExtra("body");
            showNotificationInADialog(title, message);
        }
    }
}


private void showNotificationInADialog(String title, String message) {

    // show a dialog with the provided title and message
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

3- MyFirebase sınıfını şöyle oluşturun:

package com.yourcompany.app;

import android.content.Intent;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {


    public MyFirebaseMessagingService() {
        super();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d(Application.APPTAG, "myFirebaseMessagingService - onMessageReceived - message: " + remoteMessage);

        Intent dialogIntent = new Intent(this, NotificationActivity.class);
        dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        dialogIntent.putExtra("msg", remoteMessage);
        startActivity(dialogIntent);

    }

}

4- NotificationActivity.class gibi yeni bir sınıf oluşturun:

package com.yourcompany.app;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ContextThemeWrapper;

import com.google.firebase.messaging.RemoteMessage;

public class NotificationActivity extends AppCompatActivity {

private Activity context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    Bundle extras = getIntent().getExtras();

    Log.d(Application.APPTAG, "NotificationActivity - onCreate - extras: " + extras);

    if (extras == null) {
        context.finish();
        return;
    }

    RemoteMessage msg = (RemoteMessage) extras.get("msg");

    if (msg == null) {
        context.finish();
        return;
    }

    RemoteMessage.Notification notification = msg.getNotification();

    if (notification == null) {
        context.finish();
        return;
    }

    String dialogMessage;
    try {
        dialogMessage = notification.getBody();
    } catch (Exception e){
        context.finish();
        return;
    }
    String dialogTitle = notification.getTitle();
    if (dialogTitle == null || dialogTitle.length() == 0) {
        dialogTitle = "";
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
    builder.setTitle(dialogTitle);
    builder.setMessage(dialogMessage);
    builder.setPositiveButton(getResources().getString(R.string.accept), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();

}

}

5- Bu satırları etiketlerinizin içine uygulama bildiriminize ekleyin

    <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id"/>

    <activity android:name=".NotificationActivity"
        android:theme="@style/myDialog"> </activity>

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/notification_icon"/>

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/color_accent" />

6- bu satırları Application.java onCreate () yönteminize veya MainActivity.class onCreate () yönteminize ekleyin:

      // notifications channel creation
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create channel to show notifications.
      String channelId = getResources().getString("default_channel_id");
      String channelName = getResources().getString("General announcements");
      NotificationManager notificationManager = getSystemService(NotificationManager.class);
      notificationManager.createNotificationChannel(new NotificationChannel(channelId,
              channelName, NotificationManager.IMPORTANCE_LOW));
  }

Bitti.

Şimdi bunun belirtilen 3 senaryoda iyi çalışması için Firebase web konsolundan bildirimi aşağıdaki şekilde göndermeniz gerekir:

Bildirim bölümünde: Bildirim Başlığı = Bildirim iletişim kutusunda görüntülenecek başlık (isteğe bağlı) Bildirim metni = Kullanıcıya gösterilecek mesaj (gerekli) Sonra Hedef bölümünde: Uygulama = Android uygulamanız ve Ek Seçenekler bölümünde: Android Bildirim Kanalı = default_channel_id Özel Veri anahtarı: başlık değeri: (Bildirim bölümünün Başlık alanındaki ile aynı metin) tuşu: gövde değeri: (Bildirim bölümünün Mesaj alanındaki ile aynı metin) tuşu: click_action değeri: .MainActivity Sound = Devre Dışı
Bırakma Süresi = 4 hafta

Google Play ile API 28 ile Emulator'da hata ayıklayabilirsiniz.

Mutlu kodlama!


2
Bu harika cevap için teşekkür ederim.
Alex Chengalan

@alvaro, Bildirim aldığımda Url'yi açmak istersem, Bunu nasıl başarabilirim
engmms

yakın veya öldürüldüğünde in vivo opp telefon çalışmıyor
Android Geliştirici

Bir Vivo telefonda denemedim, ancak şu anda diğer birçok Android telefonda çalışıyor. Lütfen her adımı yavaşça okuyun, tüm ayrıntıları kontrol edin ve burada bahsettiğim yöntemlerin her birinin ilk satırında hata ayıklama kesme noktalarını açın, geliştirme kablosuna gerçek bir telefonu bir kabloyla bağlayın ve gönderirken uygulamada hata ayıklayın FCM'den bir mesaj. Bahsettiğim tüm parametreleri ve biçimi içeren FCM mesajlarını gönderip göndermediğinizi kontrol edin. İyi şanslar!
alvaro

2
Bu, Firebase belgelerinin okuduğu gibi en güncel cevaptır: Uygulamanız arka planda olduğunda Android, bildirim mesajlarını sistem tepsisine yönlendirir. Bildirime bir kullanıcı dokunduğunda, varsayılan olarak uygulama başlatıcısı açılır. Bu, hem bildirim hem de veri yükü içeren iletileri içerir. Bu durumlarda, bildirim cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında teslim edilir. ( firebase.google.com/docs/cloud-messaging/android/… ) Pek çok eski yanıt güncel değil
Riot

20

Yana display-messageshangi uygulama ön planda ise sadece çalışır Firebase Bildirim UI gönderilir. İçin data-messages, bir POST arama yapmak için ihtiyaç vardır FCM

adımlar

  1. Advanced Rest Client Google Chrome Uzantısını Yükleme resim açıklamasını buraya girin

  2. Aşağıdaki başlıkları ekleyin

    Anahtar : İçerik Türü, Değer : application / json

    Anahtar : Yetkilendirme, Değer : anahtar = "sunucu anahtarınız" resim açıklamasını buraya girin

  3. Cesedi ekle

    • Konu kullanıyorsanız:

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
    • Kayıt kimliği kullanılıyorsa:

      {
          "registration_ids" : "[{"id"},{id1}]",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
           }
      }

Bu kadar!. Şimdi onMessageReceivedher zamanki gibi geri aramayı dinleyin .

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String value1 = data.get("key1");
     String value2 = data.get("key2");
}

20

Mesajı arka planda yakalamak için bir BroadcastReceiver

import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.legacy.content.WakefulBroadcastReceiver
import com.google.firebase.messaging.RemoteMessage

class FirebaseBroadcastReceiver : WakefulBroadcastReceiver() {

    val TAG: String = FirebaseBroadcastReceiver::class.java.simpleName

    override fun onReceive(context: Context, intent: Intent) {

        val dataBundle = intent.extras
        if (dataBundle != null)
            for (key in dataBundle.keySet()) {
                Log.d(TAG, "dataBundle: " + key + " : " + dataBundle.get(key))
            }
        val remoteMessage = RemoteMessage(dataBundle)
        }
    }

ve bildiriminize ekleyin:

<receiver
      android:name="MY_PACKAGE_NAME.FirebaseBroadcastReceiver"
      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>

7
Bu, uygulama arka planda olduğunda bildirim mesajını gerçekten alır. Ancak, varsayılan Firebase alıcısının onu işlemesini durdurmaz, bu nedenle mesaj yine de bir bildirim uyarısı olarak görüntülenir.
Galya

Şu anda çalışmıyor, bu yüzden bu çözümü öneriyorum. Google hata tabanında dosyalanmış bir hata var. Bunu kontrol etmek isteyebilirsiniz.
Romulano

Burada hata bir bağlantı gönderebilir misiniz
Galya

bildirimden veri nasıl alınır?
Ravi Vaghela

Uygulama öldürüldüğünde bu açıkça çalışmıyor. Bu çözümü saatlerce denedim. nedense uygulama arka planda iken alıcı çalışıyor ve uygulama öldürüldüğünde çalışmıyor
XcodeNOOB

16
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

her uygulama çağrıldığında yalnızca uygulama ön planda olduğunda çağrılmaz

uygulama ön planda veya arka planda veya öldürülmüş olursa olsun, bu yöntemin her seferinde çağrıldığı bir geçersiz kılma yöntemi vardır, ancak bu yöntem bu firebase api sürümünde kullanılabilir

bu sürümden almak zorunda u sürümü

compile 'com.google.firebase:firebase-messaging:10.2.1'

bu yöntem

@Override
public void handleIntent(Intent intent) {
    super.handleIntent(intent);

    // you can get ur data here 
    //intent.getExtras().get("your_data_key") 


}

önceki firebase api ile bu yöntem orada değildi, bu durumda yangın temel uygulaması arka planda iken kendini ele .... şimdi u yapmak istediğiniz ne bu yöntem var ... u bu yöntemle burada yapabilirsiniz .. ...

önceki sürümü kullanıyorsanız varsayılan aktivite başlar bu durumda u aynı şekilde veri alabilirsiniz

if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();

// ne istiyorsan onu yap .... }

Genellikle bu bildirimde bulunan sunucudan gelen yapıdır

{
    "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": "......."
    }
}

u nasıl bu veri anahtarı vermek istiyorum u veya u u verebilir bir şey bildirim vermek istiyorum ....... ne kadar u burada aynı anahtar ile u verecek bu veri alacak ........ .

Bu durumda u bildirim eylemini tıklatacağınız zaman tıklama eylemi göndermezseniz birkaç uygulama vardır, ancak uygulama arka planda olduğunda belirli bir etkinliğinizi açmak istediğinizde u bu aktiviteyi handleIntent yönteminde çağırabilirsiniz, çünkü bu her seferinde çağrılır


Firebase mesajlaşmasını 10.2.1 olarak güncelledim, bildirim mesajına Veri Ekledim ve işe yaradı. Ön Plan, Arka Plan ve Öldürüldü. Teşekkürler
Firas Shrourou

Kotlin, bu hatayı alıyorum: (44, 5) 'FirebaseMessagingService' de 'handleIntent' son ve geçersiz kılınamaz
ugali soft

Firebase 11
venu46 11:19

14

Dokümanlara göre: 17 Mayıs 2017

Uygulamanız arka planda olduğunda , Android bildirim mesajlarını sistem tepsisine yönlendirir. Bildirime bir kullanıcı dokunduğunda, varsayılan olarak uygulama başlatıcısı açılır .

Buna hem bildirim hem de veri yükü içeren iletiler (ve Bildirimler konsolundan gönderilen tüm iletiler) dahildir. Bu durumlarda, bildirim cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında teslim edilir.

Bu nedenle, her iki yük bildirimi + verilerini kullanmalısınız:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

Click_action kullanmanıza gerek yoktur. LAUNCHER etkinliğinin amacından sadece ekstralar almalısınız

<activity android:name=".MainActivity">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

MainActivity'de Java kodu onCreate yönteminde olmalıdır:

Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
    Bundle extras = intent.getExtras();
    String someData= extras.getString("someData");
    String someData2 = extras.getString("someData2");
}

Her iki yük bildirimi + verilerini Firebase Bildirim Konsolu'ndan test edebilirsiniz . Gelişmiş seçenekler bölümündeki özel veri alanlarını doldurmayı unutmayın


13

İşte firebase mesajı hakkında daha açık kavramlar. Destek ekibinden buldum.

Firebase'in üç mesaj türü vardır :

Bildirim mesajları : Bildirim mesajı arka planda veya ön planda çalışır. Uygulama arka planda olduğunda, bildirim mesajları sistem tepsisine gönderilir. Uygulama ön plandaysa, iletiler onMessageReceived()veya tarafından işlenirdidReceiveRemoteNotification geri aramalar . Bunlar aslında Ekran mesajları olarak adlandırılanlardır.

Veri mesajları : Android platformunda, veri mesajı arka planda ve ön planda çalışabilir. Veri mesajı onMessageReceived () tarafından işlenir. Platforma özel bir not şöyledir: Android'de veri yükü, etkinliğinizi başlatmak için kullanılan Niyet'ten alınabilir. Ayrıntılı olarak açıklamak gerekirse "click_action":"launch_Activity_1", bu amacı getIntent()yalnızcaActivity_1 .

Hem bildirim hem de veri yükü içeren iletiler : Arka planda olduğunda, uygulamalar bildirim tepsisindeki bildirim yükünü alır ve veri yükünü yalnızca kullanıcı bildirime dokunduğunda işler. Ön planda olduğunda, uygulamanız her iki yükü de içeren bir mesaj nesnesi alır. İkincisi,click_action parametre genellikle veri yükünde değil, bildirim yükünde kullanılır. Veri yükü içinde kullanılırsa, bu parametre özel anahtar / değer çifti olarak kabul edilir ve bu nedenle amaçlandığı şekilde çalışması için özel mantık uygulamanız gerekir.

Ayrıca, onMessageReceivedveri paketini ayıklamak için yöntem (bkz. Veri mesajı) kullanmanızı öneririz . Mantığınızdan, paket nesnesini kontrol ettim ve beklenen veri içeriğini bulamadım. İşte daha fazla netlik sağlayabilecek benzer bir duruma bir referans.

Daha fazla bilgi için bu konuyu ziyaret edin



8

Bunun gibi basit bir özet

  • uygulamanız çalışıyorsa;

    onMessageReceived()

tetikleyicidir.

  • uygulamanız çalışmıyorsa (kaydırarak öldürülür);

    onMessageReceived()

direclty tarafından tetiklenmez ve iletilmez. Herhangi bir özel anahtar / değer çiftiniz varsa. OnMessageReceived () nedeniyle çalışmazlar.

Bu şekilde buldum;

Başlatıcı etkinliğinizde bu mantığı ekleyin,

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
    }
}

bu if bloğunda, firebase arayüzüne göre anahtarlarınızı arayın.

Bu örnekte anahtarım ve değerim yukarıdaki gibi; (dil için özür dilerim =)) resim açıklamasını buraya girin

Kodum çalıştığında, "com.rda.note" olsun.

android.os.Process.killProcess(android.os.Process.myPid());

bu kod satırıyla başvurumu kapattım ve Google Play Market'i açtım

mutlu kodlama =)


6

Senaryoları anladım,

Uygulama olduğunda ön , onMessageReceived () metodu denir FirebaseService .bu pendingIntent çağrılır hizmet sınıfı tanımlanmıştır.

Uygulama arka planda olduğunda , ilk etkinlik çağrılır.

Eğer bir kullanmak Şimdi, eğer sıçrama aktivitesini ardından gerekir akılda tutmak splashactivity sonra ilk etkinlik ne olursa olsun, adı verilecek hiçbir splashActivity, yoksa başka, çağrılacak.

Sonra herhangi bir paket olup olmadığını görmek için firstActivity'nin getIntent () öğesini kontrol etmeniz gerekir. Her şey yolundaysa , paketin doldurulmuş değerlerle orada olduğunu görürsünüz. Sunucudan gönderilen veri etiketindeki değer şöyle görünürse ,

"data": {
    "user_name": "arefin sajib",
    "value": "user name notification"
  }

Daha sonra ilk etkinlikte, geçerli bir niyet ( getIntent () boş değil ), geçerli bir paket ve iç paket olduğunu göreceksiniz, anahtar olarak verilerle yukarıda belirtilen tüm JSON olacaktır .

Bu senaryo için, değer çıkarma kodu şöyle görünecektir,

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


            }
        }

3

Cevaplarınız için hepinize teşekkürler. Ancak bunu Bildirim göndermek yerine veri mesajı göndererek çözdüm . Sunucu kodu

<?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;

?>

Ve Verileri onMessageReceived'de yakaladı

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

1
arka planla da çalışıyor mu?
Tabish khan

@Tabishkhan Evet kardeşim herhangi bir sorun varsa bana sormaya çekinmeyin .. teşekkürler
Android Sanaullah

1
merhaba @AndroidSanaullah, ilk kısmı sunucu kodunu açıklayabilir misiniz, aslında nereye koydunuz, aynı sorunla karşı karşıyayım ama sunucu bölümünü tam olarak anlamıyorum, postacı kullanıyor musunuz?
Shid

curl istek için kullanılır ve tüm parametreler iletilir. @ Shid
Android Sanaullah

2

Bildirim yükünü sunucu isteğinizden tamamen kaldırın . Yalnızca veri gönderin ve işleyin onMessageReceived(), aksi takdirde onMessageReceiveduygulama arka planda veya öldürüldüğünde tetiklenmez.

İşte sunucudan ne gönderiyorum:

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}

Böylece verilerinizi şu şekilde alabilirsiniz onMessageReceived(RemoteMessage message): (diyelim ki kimliği almam gerekiyor)

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

Benzer şekilde, sunucudan gönderdiğiniz verileri de alabilirsiniz onMessageReceived().


2

Uygulama aşağıdaki gibi arka planda ve ön planda olsa bile mesaj göndermenin kolay yolu: - API kullanarak bir mesaj göndermek için, AdvancedREST Client adlı bir araç, onun bir krom uzantısı ve aşağıdaki parametrelerle bir mesaj gönderebilirsiniz.

Kalan istemci aracı Bağlantı: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

bu url'yi kullanın: - https://fcm.googleapis.com/fcm/send İçerik Türü: application / json Yetkilendirme: key = Sunucu anahtarınız Kimden veya Yazma anahtarı (aşağıya bakın 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"
}

Yetkilendirme anahtarı, Google geliştiricileri konsolunu ziyaret ederek ve projeniz için soldaki menüden Kimlik Bilgileri düğmesini tıklayarak elde edilebilir. Listelenen API anahtarları arasında, sunucu anahtarı yetkilendirme anahtarınız olacaktır.

Ayrıca, API kullanarak gönderilen POST isteğinizin "alıcı" bölümüne alıcının tokenID'sini koymanız gerekir.


2

arka planda çalışmak istediğinizdeMessageReceived (RemoteMessage remoteMessage) sadece veri bölümü bildirim kısmını gönderir:

"data":    "image": "",    "message": "Firebase Push Message Using API", 

"AnotherActivity": "Doğru", "-": "cihaz kimliği Veya Cihaz belirteci"

Bu ile onMessageRecivied çağrı arka plan ve ön planda başlatıcısı etkinliğinizde bildirim tepsisini kullanarak bildirim işlemeye gerek yoktur. Bunu kullanarak veri yükünü işleyin:

  public void onMessageReceived(RemoteMessage remoteMessage)
    if (remoteMessage.getData().size() > 0) 
    Log.d(TAG, "Message data payload: " + remoteMessage.getData());      

1

Haziran 2018 Cevap -

Mesajın hiçbir yerinde bir "bildirim" anahtar kelimesi olmadığından emin olmalısınız. Yalnızca "veriler" i içerdiğinizde uygulama, arka planda veya öldürülmüş olsa bile mesajı onMessageReceived'de işleyebilir.

Bulut İşlevlerini Kullanma:

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

Sonra onMessageReceived () öğenizde, sınıfınızda com.google.firebase.messaging.FirebaseMessagingService öğesini genişleterek:

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.

Herhangi bir kaynağın var mı, güvenli mi?
Yogesh Rathi

Güvenli, uygulamalarımda kullanıyorum. Ancak, gönderdikten 6 ay sonra kaynağı hatırlayamıyorum.
Jeff Padgett

1

OAUTH 2.0'a göre:

FCM şimdi OAUTH 2 kullanan bu durum için Auth sorunu olacak

Bu yüzden firebase belgelerini okudum ve belgelere göre veri mesajı göndermenin yeni yolu;

POST: https://fcm.googleapis.com/v1/projects/YOUR_FIREBASEDB_ID/messages:send

Başlıkları

Key: Content-Type, Value: application/json

auth

Bearer YOUR_TOKEN 

Örnek Gövde

{
   "message":{
    "topic" : "xxx",
    "data" : {
         "body" : "This is a Firebase Cloud Messaging Topic Message!",
         "title" : "FCM Message"
          }
      }
 }

Url'de, firebase konsolunuzda bulabileceğiniz Veritabanı Kimliği var. (Git proje yerleşimleri)

Ve şimdi bizim jetonu alalım (Sadece 1 saat geçerli olacak):

İlk olarak Firebase konsolunda Ayarlar> Hizmet Hesapları'nı açın . Yeni Özel Anahtar Oluştur'u tıklatın , anahtarı içeren JSON dosyasını güvenli bir şekilde saklayın. Sunucu isteklerini el ile yetkilendirmek için bu JSON dosyasına ihtiyacım vardı. İndirdim.

Sonra bir node.js projesi oluşturmak ve belirteci almak için bu işlevi kullandım;

var PROJECT_ID = 'YOUR_PROJECT_ID';
var HOST = 'fcm.googleapis.com';
var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
var SCOPES = [MESSAGING_SCOPE];

  router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
      getAccessToken().then(function(accessToken) {
        console.log("TOKEN: "+accessToken)
      })

    });

function getAccessToken() {
return new Promise(function(resolve, reject) {
    var key = require('./YOUR_DOWNLOADED_JSON_FILE.json');
    var jwtClient = new google.auth.JWT(
        key.client_email,
        null,
        key.private_key,
        SCOPES,
        null
    );
    jwtClient.authorize(function(err, tokens) {
        if (err) {
            reject(err);
            return;
        }
        resolve(tokens.access_token);
    });
});
}

Şimdi bu simgeyi gönderi isteğimde kullanabilirim. Sonra veri mesajımı gönderiyorum ve şimdi uygulamalarımMesajReceived işlevinde işleniyor.


Kabul edilen cevap çalışıyor, barer token auth yolu değil, Postacı ile denemek için bunu okumalısınız: stackoverflow.com/questions/45309674/…
Carlos Jesus Arancibia Taborga

1

2019'dan beri Google Firebase'in API'larında büyük bir değişiklik var demek istiyorum: 'com.google.firebase:firebase-messaging:18.0.0'

18.0.0'da kaldırıldılar MyFirebaseInstanceIDServiceve jeton almanız gerekiyor, MyFirebaseMessagingServiceböylece sadece yazmanız gerekiyor:

@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

}

AndroidManifest.xml dosyasında da kaldırmanız gerekir:

<service android:name=".service.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

Ayrıca, bildirimlerin görünümünü özelleştirmek için varsayılan değerleri ayarlamanız önerilir. Bildirim yükünde eşdeğer değerler ayarlanmadığında uygulanacak özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.

Özel varsayılan simgeyi ve özel rengi ayarlamak için uygulama satırının içine şu satırları ekleyin:

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_notification" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/push_channel" />

şimdi arka plandaki bir uygulamadaki bildirim mesajlarını işlemek için SplashScreen olsa bile ilk Etkinliğinizde bir Niyet tanımlamalısınız, Uygulamanız arka planda olduğunda, Android bildirim mesajlarını sistem tepsisine yönlendirir. Bildirime bir kullanıcı dokunması varsayılan olarak uygulama başlatıcıyı açar.

örneğin, Json'unuz böyle ise:

 "data": {
"message": "2",
"title": "1",
"pushType" : "banner",
"bannerLink": "http://www.google.com",
"image" : "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}

bu değerleri elde etmek için basit bir niyet yazmanız yeterlidir:

        Bundle extras = intent.getExtras();
        String bannerLink = extras.getString("bannerLink");
        ...
        String channelId = extras.getString("channelId");

0

Kullandığınız push bildirimleri test ediyorsanız yukarıdaki cevaplara ek olarak, FCM konsolu , 'veri' anahtar ve nesne olduğunu değil Push Bildirim gruba eklenir. Bu nedenle, Uygulama arka plan veya öldürüldüğünde ayrıntılı push bildirimi almazsınız.

Bu durumda, Uygulama arka plan senaryosunu test etmek için arka uç yönetici konsolunuzu seçmeniz gerekir.

Burada, push paketinize 'veri' anahtarı ekleyeceksiniz. bu nedenle ayrıntılı itme beklendiği gibi gösterilecektir. Umarım bu az yardımcı olur.


0

Bu kodu kullanarak bildirimi arka planda / ön planda alabilir ve işlem yapabilirsiniz:

//Data should come in this format from the notification
{
  "to": "/xyz/Notifications",
  "data": {
      "key1": "title notification",
      "key2": "description notification"
  }
}

Uygulama İçi bu kodu kullanın:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }

// Veriler {"-": "/ xyz / Bildirimler", "data" bildiriminden bu biçimde gelmelidir: {"key1": "başlık bildirimi", "key2": "açıklama bildirimi"}} Nasıl yazılır? php hizmetinde bu kod?
Tabish khan

-3

İki tür bildirim olacaktır

  1. Ekran Bildirimi - Yalnızca ekran bildirimleri, yalnızca uygulama açık değil ve uygulama yığınında gösterilir.
  2. Veri Bildirimi - geri arama onMessageReceived firebasemessagingservice yöntemine girecek ve uygulama arka planda, ön planda veya öldürülmüş durumda olduğunda çalışır.

Uygulama arka planda olduğunda bildirimi işlemek için Veri Bildirimleri'ni kullanmanız gerekir.


-5

Aynı sorunu yaşadım ve firebase kütüphanesini yeniden derledim ve uygulama arka planda olduğunda bildirim göndermesini engelledim

* kütüphane 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
}

umut yardımcı olur. İyi şanslar



2
Bu korkunç bir öneri.
vsecades
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.