Cara menangani pemberitahuan saat aplikasi di latar belakang di Firebase

429

Ini manifes saya

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

Ketika aplikasi di latar belakang dan notifikasi tiba maka notifikasi default datang dan tidak menjalankan kode saya onMessageReceived.

Ini onMessageReceivedkode saya . Ini memanggil jika aplikasi saya berjalan di latar depan, bukan ketika aplikasi di latar belakang. Bagaimana cara menjalankan kode ini ketika aplikasi di latar belakang juga?

// [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]
Parth Patel
sumber
1
Itu ditulis dalam sampel override onMessageReceived () , kata komentar kedua Not getting messages here? See why this may be: goo.gl/39bRNJ . Solusinya, seperti jawaban di bawah ini, dapat ditemukan dalam dokumentasi di Pesan dengan notifikasi dan data payload
fllo
Singkatnya, untuk membangunkan aplikasi Anda yang terbunuh, Anda harus selalu mengirim pemberitahuan dengan objek data untuk memanggil penangan kelas layanan pemberitahuan FirebaseMessagingService.onMessageReceived () di aplikasi Anda. Coba juga mengirimnya bukan dari Firebase console, tetapi untuk mempostingnya dari tempat lain (mis. Layanan pengujian pos online).
Zon
1
solusi ini berhasil untuk saya stackoverflow.com/a/44150822/6632278 harap membantu. Semoga beruntung
Tony Barajas
apa ".fcm." PshycoFirebaseMessagingServices ada di manifes Anda? Saya mendapatkan kesalahan kelas tidak ditemukan .. dan tidak menemukan di mana pun apa ini bagian pertama dari parameter.
Éder Rocha Bezerra

Jawaban:

661

1. Mengapa ini terjadi?

Ada dua jenis pesan dalam FCM (Firebase Cloud Messaging):

  1. Pesan Layar : Pesan -pesan ini memicu onMessageReceived()panggilan balik hanya ketika aplikasi Anda di latar depan
  2. Pesan Data : Pesan- pesan ini memicu onMessageReceived()panggilan balik bahkan jika aplikasi Anda di latar depan / latar belakang / terbunuh

CATATAN: Tim Firebase belum mengembangkan UI untuk dikirim data-messageske perangkat Anda. Anda harus menggunakan server Anda untuk mengirim tipe ini!



2. Bagaimana caranya?

Untuk mencapai ini, Anda harus melakukan POSTpermintaan ke URL berikut:

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

Tajuk

  • Key: Content-Type , Nilai: application/json
  • Key: Authorization , Nilai: key=<your-server-key>

Tubuh menggunakan topik

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

Atau jika Anda ingin mengirimnya ke perangkat tertentu

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


CATATAN: Pastikan Anda tidak menambahkan kunci JSON. notification
CATATAN: Untuk mendapatkan kunci server Anda, Anda dapat menemukannya di konsol firebase:Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. Bagaimana cara menangani pesan push notification?

Ini adalah cara Anda menangani pesan yang diterima:

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

     // Manage data
}
Antonio
sumber
4
Anda dapat mengirim kunci "data" dan "pemberitahuan" dalam pemberitahuan yang sama mengikuti langkah-langkah ini stackoverflow.com/a/42279260/2734021 :)
Daniel S.
15
Firebase team have not developed a UI to send data-messages to your devices, yet.Apakah ini berubah dalam satu tahun terakhir?
Hankrecords
2
@Antonio Dalam oreo saat aplikasi terbunuh, onMessageReceived tidak dipanggil. saya hanya punya payload dengan data saja. Apakah ada pembaruan yang Anda miliki?
Samir Mangroliya
63
Ketika aplikasi di latar belakang onMessageReceivedtidak dipanggil dan ini adalah masalah serius di FCM !!! Harap perbarui jawaban Anda juga.
Muhammad Babar
2
Nah, bagi saya, sepertinya ini terjadi pada perangkat android tertentu. Menghabiskan berjam-jam berpikir bahwa itu adalah masalah aktual, tetapi kemudian ternyata bukan apa-apa. Jadi saran saya adalah mengujinya di perangkat yang berbeda. Saya bahkan mengujinya pada VM dan saya mendapat notifikasi bahkan ketika aplikasi terbunuh. Saya hanya mengatakan ini untuk menghemat waktu seseorang.
Tarek-Dev
158

Untuk membuat pustaka firebase untuk memanggil onMessageReceived () Anda dalam kasus berikut

  1. Aplikasi di latar depan
  2. Aplikasi di latar belakang
  3. Aplikasi telah terbunuh

Anda tidak boleh memasukkan 'notifikasi' kunci JSON dalam permintaan Anda ke firebase API tetapi menggunakan 'data', lihat di bawah.

Pesan berikut tidak akan memanggil onMessageReceived () Anda saat aplikasi berada di latar belakang atau terbunuh, dan Anda tidak dapat menyesuaikan notifikasi Anda.

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

tetapi menggunakan ini akan bekerja

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

Pada dasarnya, pesan dikirim dalam argumen RemoteMessage bersama dengan objek data Anda sebagai Peta, maka Anda dapat mengelola notifikasi di onMessageRivedived seperti dalam snippet di sini

@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
    */
}
Teerakiat Chitawattanarat
sumber
1
Apakah mungkin untuk mencapai ini dari Firebase console?
koder
@koder, sayangnya Firebase console tidak mendukung ini, Anda harus menggunakan alat untuk mengirim permintaan pesan pos ke firebase seperti curl atau tukang pos (plugin chrome), firebase messaging api silakan merujuk ke dokumen di sini - firebase.google.com/docs / cloud-messaging / http-server-ref
Teerakiat Chitawattanarat
1
ini adalah apa yang saya cari lebih dari satu hari ..... Terima kasih banyak ini bekerja dengan sempurna. dan akan lebih baik jika Anda menjelaskan bagaimana pasangan kunci dalam data dapat ditangani di onMessageReceived () untuk memulai aktivitas dengan nilai-nilai tersebut.
Boopathi T
25
Metode Anda berfungsi dengan baik ketika aplikasi di latar belakang, namun ketika aplikasi ini terbunuh saya tidak menerima data
Sanzhar
8
Masalah yang sama dengan Sanzhar. Jika aplikasi ini terbunuh saya tidak menerima pesan apa pun.
Giacomo M
104

Saya merasa semua tanggapan tidak lengkap tetapi semuanya memiliki sesuatu yang Anda perlukan untuk memproses pemberitahuan yang memiliki data saat aplikasi Anda ada di latar belakang.

Ikuti langkah-langkah ini dan Anda akan dapat memproses pemberitahuan saat aplikasi Anda ada di latar belakang.

1.Tambahkan filter maksud seperti ini:

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

ke aktivitas yang Anda inginkan untuk memproses data notifikasi.

  1. Kirim pemberitahuan dengan format berikutnya:

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

Kuncinya di sini adalah menambahkan

"click_action" : ".MainActivity"

di mana .MainActivity adalah aktivitas dengan filter maksud yang Anda tambahkan di langkah 1.

  1. Dapatkan info "data" dari notifikasi di onCreate of ".MainActivity":

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

Dan hanya itu yang harus Anda lakukan. Saya harap ini membantu seseorang :)

Daniel S.
sumber
5
Ini seharusnya jawaban yang benar. Tidak ada dokumen yang mengatakan apa pun tentang memerlukan click_action DAN Filter Intent agar pemberitahuan bahkan muncul di baki. Keduanya diperlukan.
airowe
@airowe mereka tidak diharuskan untuk pemberitahuan muncul
AlwaysConfused
Saya memiliki data dan blok notifikasi tetapi saya tidak dapat menerima data dalam aktivitas?
Ashwani
3
Saya hanya tidak mengerti bagaimana ini bukan jawaban yang diterima. Tanpa click_action, itu tidak akan berfungsi. Menyelamatkan hari saya
Arun Shankar
4
Terima kasih atas dukungan Anda @ArunShankar. Jawaban yang diterima ditanggapi 7 bulan sebelum saya dan jawaban yang bagus. Saya tidak mengerti mengapa tidak ada yang berbicara tentang click_action dan itulah mengapa saya telah menambahkan jawaban saya. Saya sangat senang bahwa ini sangat berguna bagi banyak orang dan itulah yang penting di akhir hari :)
Daniel S.
42

Menurut dokumentasi firebase dalam mengirim hilir menggunakan firebase , ada 2 jenis muatan:

  1. data

    Parameter ini menentukan pasangan nilai kunci kustom dari muatan pesan. Aplikasi klien bertanggung jawab untuk memproses pesan data. Pesan data hanya memiliki pasangan nilai kunci khusus.

  2. pemberitahuan

    Parameter ini menentukan pasangan nilai kunci yang telah ditentukan sebelumnya dan terlihat oleh pengguna dari notifikasi payload. FCM secara otomatis menampilkan pesan ke perangkat pengguna akhir atas nama aplikasi klien. Pesan pemberitahuan memiliki sekumpulan kunci yang terlihat oleh pengguna.

Ketika Anda berada di latar depan Anda bisa mendapatkan data di dalam FCM menggunakan onMessageReceived () , Anda bisa mendapatkan data dari payload data .

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

Saat Anda berada di latar belakang, FCM akan menampilkan pemberitahuan di baki sistem berdasarkan info dari payload pemberitahuan . Judul, pesan, dan ikon yang digunakan untuk notifikasi pada baki sistem didapat dari payload notifikasi .

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

Ini pemberitahuan payload digunakan ketika Anda ingin automactically menampilkan notifikasi pada system tray ketika aplikasi Anda di latar belakang. Untuk mendapatkan data notifikasi saat aplikasi Anda di latar belakang, Anda harus menambahkan click_action di dalam payload notifikasi .

Jika Anda ingin membuka aplikasi dan melakukan tindakan tertentu [sambil berlatar belakang], atur click_action di payload notifikasi dan petakan ke filter maksud dalam Kegiatan yang ingin Anda luncurkan. Misalnya, setel click_action ke OPEN_ACTIVITY_1 untuk memicu filter maksud seperti berikut:

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

Letakkan filter maksud pada manifes Anda, di dalam salah satu tag aktivitas Anda. Saat Anda mengeklik pemberitahuan, itu akan membuka aplikasi dan langsung ke aktivitas yang Anda tentukan di click_action, dalam hal ini "OPEN_ACTIVTY_1". Dan di dalam aktivitas itu Anda bisa mendapatkan data dengan:

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

Saya menggunakan FCM untuk aplikasi Android saya dan menggunakan kedua payload. Berikut ini contoh JSON yang saya gunakan:

{
  "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"
   }
}
Hendy Evan
sumber
"Letakkan filter maksud itu di manifes Anda, di dalam tag aplikasi." Anda tidak dapat memasukkan filter maksud di dalam tag aplikasi.
Kyrylo Zapylaiev
JSON dows Anda tidak menunjukkan arah tombol click_action.
Josh
ini bukan jawaban yang tepat? apa itu aksi klik dan kemana perginya? seseorang harus memilih atau membersihkan ini
rana
1
@KyryloZapylaiev Saya baru saja memperbaiki & memperbarui jawabannya: "Letakkan filter maksud pada manifes Anda, di dalam salah satu tag aktivitas Anda".
Dika
1
@Josh diperbarui dan diformat. Anda dapat memeriksanya kembali
Dika
32

Menurut dokumen

Menangani pesan di aplikasi latar belakang

Saat aplikasi Anda berada di latar belakang, Android mengarahkan pesan pemberitahuan ke baki sistem. Ketuk pengguna pada notifikasi membuka peluncur aplikasi secara default.

Ini termasuk pesan yang mengandung notifikasi dan muatan data. Dalam kasus ini, notifikasi dikirimkan ke baki sistem perangkat, dan muatan data dikirimkan dalam bentuk ekstra maksud aktivitas Peluncur Anda.

Jika Anda ingin membuka aplikasi dan melakukan tindakan tertentu, atur click_action di payload notifikasi dan petakan ke filter maksud dalam Kegiatan yang ingin Anda luncurkan. Misalnya, setel click_action ke OPEN_ACTIVITY_1 untuk memicu filter maksud seperti berikut:

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

Edit:

Berdasarkan utas ini :

Anda tidak dapat mengatur muatan click_action menggunakan Firebase Console. Anda dapat mencoba pengujian dengan perintah curl atau server http khusus

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\"}}"
Shubhank
sumber
1
kamu benar. saya telah membaca dokumen. tetapi saya bingung di mana harus meletakkan ini dalam manifes saya? saya harus menjalankan kode pada onMessageReceived pada file java itu jadi untuk itu apa yang harus saya lakukan pak?
Parth Patel
Anda tidak dapat membuat aplikasi secara otomatis memanggilMessageReveiced ketika itu di latar belakang. Sebaliknya, Anda perlu menangani niat yang diterima dan membuat pawang menyebutnya. Atau mungkin yang terbaik adalah mengimplementasikan kelas / metode terpisah yang dipanggil oleh onMessageReveiced dan penanganan maksud Anda. Saya menambahkan handler ke onNewIntent dari aktivitas utama dan berfungsi dengan baik untuk saya.
diidu
terlambat untuk menjawab pertanyaan-pertanyaan @Parath Patel tapi mungkin ini akan membantu orang lain dengan masalah yang sama, lihat jawaban saya di sini stackoverflow.com/a/42279260/2734021
Daniel S.
di mana harus meletakkan tindakan ini? untuk aktivitas atau layanan Firebasemessage saya?
Mahdi
** pada beberapa pengalihan notifikasi tidak berfungsi? mis: jika saya memiliki tiga notifikasi dari fcm di latar belakang menggunakan "click_action" notifikasi pertama berhasil dialihkan dan kemudian 2 notifikasi klik aktivitas redirection tidak berfungsi
prasanthMurugan
24

Bekerja pada Juli 2019

Android compileSdkVersion 28, buildToolsVersion 28.0.3 dan firebase-messaging: 19.0.1

Setelah berjam-jam meneliti semua pertanyaan dan jawaban StackOverflow lainnya, dan mencoba solusi usang yang tak terhitung jumlahnya, solusi ini berhasil menampilkan pemberitahuan dalam 3 skenario berikut:

- Aplikasi di latar depan:
pemberitahuan diterima oleh metode onMessageReceived di kelas MyFirebaseMessagingService saya

- Aplikasi telah terbunuh (tidak berjalan di latar): notifikasi dikirim ke baki notifikasi secara otomatis oleh FCM. Ketika pengguna menyentuh pemberitahuan aplikasi diluncurkan dengan memanggil aktivitas yang memiliki android.intent.category.LAUNCHER di manifes. Anda bisa mendapatkan bagian data pemberitahuan dengan menggunakan getIntent (). GetExtras () di metode onCreate ().

- Aplikasi di latar belakang: notifikasi dikirim ke baki notifikasi secara otomatis oleh FCM. Ketika pengguna menyentuh notifikasi, aplikasi dibawa ke latar depan dengan meluncurkan aktivitas yang memiliki android.intent.category.LAUNCHER di manifes. Karena aplikasi saya memiliki launchMode = "singleTop" dalam aktivitas itu, metode onCreate () tidak dipanggil karena satu aktivitas dari kelas yang sama sudah dibuat, sebaliknya metode onNewIntent () dari kelas itu dipanggil dan Anda mendapatkan bagian data dari pemberitahuan di sana dengan menggunakan intent.getExtras ().

Langkah-langkah: 1- Jika Anda mendefinisikan aktivitas utama aplikasi Anda seperti ini:

<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- tambahkan baris ini di metode onCreate () dari MainActivity.class Anda

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

dan metode ini ke MainActivity.class yang sama:

@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- buat kelas MyFirebase seperti ini:

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- buat kelas baru NotificationActivity.class seperti ini:

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- Tambahkan baris ini ke manifes aplikasi Anda, di dalam tag Anda

    <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- tambahkan baris ini dalam metode Application.java onCreate () Anda, atau dalam metode MainActivity.class onCreate ():

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

Selesai

Sekarang agar ini berfungsi dengan baik dalam 3 skenario yang disebutkan, Anda harus mengirim pemberitahuan dari konsol web Firebase dengan cara berikut:

Di bagian Pemberitahuan: Judul Pemberitahuan = Judul untuk ditampilkan dalam dialog pemberitahuan (opsional) Teks pemberitahuan = Pesan untuk ditampilkan kepada pengguna (wajib) Kemudian di bagian Target: Aplikasi = aplikasi Android Anda dan di bagian Opsi Tambahan: Saluran Pemberitahuan Android = default_channel_id Kunci Data Kustom: nilai judul: (teks yang sama di sini daripada di bidang Judul di bagian Pemberitahuan) kunci: nilai tubuh: (teks yang sama di sini daripada di bidang Pesan di bagian Pemberitahuan) kunci: click_action value: .MainActivity Sound = Dinonaktifkan
Kedaluwarsa = 4 minggu

Anda dapat men-debug-nya di Emulator dengan API 28 dengan Google Play.

Selamat coding!

alvaro
sumber
2
Terima kasih atas jawaban yang bagus ini.
Alex Chengalan
@alvaro, Jika saya ingin membuka Url ketika saya menerima Notifikasi, Bagaimana Saya Bisa Mengatasinya
engmms
tidak bekerja di telepon opp vivo ketika aplikasi ditutup atau dimatikan
Pengembang Android
Saya belum pernah mencoba di telepon Vivo tetapi saat ini bekerja di banyak ponsel Android lainnya. Harap baca perlahan setiap langkah, periksa semua detail, lalu nyalakan debugging breakpoints di baris pertama dari masing-masing metode yang saya sebutkan di sini, sambungkan telepon asli ke komputer pengembangan Anda dengan kabel dan debug aplikasi sambil mengirim pesan dari FCM. Periksa apakah Anda mengirim pesan FCM dengan semua parameter dan format yang saya sebutkan. Semoga berhasil!
alvaro
2
Ini adalah jawaban yang paling baru, karena dokumentasi Firebase sekarang berbunyi: Ketika aplikasi Anda di latar belakang, Android mengarahkan pesan pemberitahuan ke baki sistem. Ketuk pengguna pada notifikasi membuka peluncur aplikasi secara default. Ini termasuk pesan yang mengandung notifikasi dan muatan data. Dalam kasus ini, notifikasi dikirimkan ke baki sistem perangkat, dan muatan data dikirimkan dalam bentuk ekstra maksud aktivitas Peluncur Anda. ( firebase.google.com/docs/cloud-messaging/android/… ) Begitu banyak jawaban lama yang ketinggalan zaman
Riot Goes Woof
20

Karena display-messagesyang dikirim dari Firebase Notification UI hanya berfungsi jika aplikasi Anda ada di latar depan. Sebab data-messages, ada kebutuhan untuk melakukan panggilan POST ke FCM

Langkah

  1. Instal Perpanjangan Klien Lanjutan Google Chrome Extension masukkan deskripsi gambar di sini

  2. Tambahkan tajuk berikut

    Kunci : Tipe-Konten, Nilai : application / json

    Kunci : Otorisasi, Nilai : key = "kunci server Anda" masukkan deskripsi gambar di sini

  3. Tambahkan tubuh

    • Jika menggunakan topik:

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
    • Jika menggunakan id pendaftaran:

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

Itu dia!. Sekarang dengarkan onMessageReceivedcallback seperti biasa.

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

Untuk mengambil pesan di latar belakang, Anda perlu menggunakan a 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)
        }
    }

dan tambahkan ini ke manifes Anda:

<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>
Romulano
sumber
7
Ini benar-benar menerima pesan notifikasi, ketika aplikasi di latar belakang. Tetapi itu tidak menghentikan penerima Firebase default untuk menanganinya, sehingga pesan tersebut tetap ditampilkan sebagai peringatan notifikasi.
Galya
Saat ini tidak berfungsi, jadi itu sebabnya saya mengusulkan solusi ini. Ada bug yang diajukan di google bugbase. Anda mungkin ingin memeriksanya.
Romulano
Bisakah Anda memposting tautan ke bug di sini
Galya
bagaimana cara mendapatkan data dari notifikasi?
Ravi Vaghela
Ini jelas tidak berfungsi ketika aplikasi terbunuh. Saya telah mencoba solusi ini selama berjam-jam. untuk beberapa alasan penerima bekerja saat aplikasi berada di latar belakang dan tidak bekerja ketika aplikasi terbunuh
XcodeNOOB
16
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

tidak dipanggil setiap kali itu dipanggil hanya ketika aplikasi di forground

ada satu metode timpa metode ini disebut setiap kali, tidak peduli apa aplikasi di latar depan atau di latar belakang atau terbunuh tetapi metode ini tersedia dengan versi api firebase ini

ini adalah versi yang harus Anda impor dari gradle

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

ini metodenya

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

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


}

dengan api firebase sebelumnya metode ini tidak ada di sana sehingga dalam kasus itu pangkalan api menangani sendiri ketika aplikasi di latar belakang .... sekarang Anda memiliki metode ini apa yang ingin Anda lakukan ... Anda dapat melakukannya di sini dalam metode ini .. ...

jika Anda menggunakan versi sebelumnya dari aktivitas default akan dimulai dalam hal ini Anda bisa mendapatkan data dengan cara yang sama

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

// lakukan apa yang kau inginkan ....}

umumnya ini adalah struktur dari server yang kami terima dalam pemberitahuan

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

terserah Anda bagaimana Anda ingin memberikan kunci data itu atau Anda ingin memberikan pemberitahuan apa pun yang dapat Anda berikan ....... apa pun yang akan Anda berikan di sini dengan kunci yang sama Anda akan mendapatkan data itu ........ .

ada beberapa kasus jika Anda tidak mengirim tindakan klik dalam kasus itu ketika Anda akan mengklik pemberitahuan aktivitas default akan terbuka, tetapi jika Anda ingin membuka aktivitas spesifik Anda ketika aplikasi di latar belakang Anda dapat memanggil aktivitas Anda dari ini pada metode handleIntent karena ini disebut setiap waktu

Avinash Jadaun
sumber
Saya memperbarui firebase-messaging ke 10.2.1, Menambahkan Data ke pesan notifikasi, dan itu berhasil. Foreground, Background, dan Killed. Terima kasih
Firas Shrourou
di Kotlin, saya mendapatkan Kesalahan ini: (44, 5) 'handleIntent' di 'FirebaseMessagingService' adalah final dan tidak dapat ditimpa
ugali soft
Ini tidak berfungsi di atas versi firebase 11
venu46
14

Menurut dokumen: 17 Mei 2017

Saat aplikasi Anda berada di latar belakang , Android mengarahkan pesan pemberitahuan ke baki sistem. Ketuk pengguna pada notifikasi membuka peluncur aplikasi secara default .

Ini termasuk pesan yang berisi notifikasi dan muatan data (dan semua pesan yang dikirim dari konsol Pemberitahuan). Dalam kasus ini, notifikasi dikirimkan ke baki sistem perangkat, dan muatan data dikirimkan dalam bentuk ekstra maksud aktivitas Peluncur Anda.

Jadi, Anda harus menggunakan kedua notifikasi + data payload:

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

Tidak perlu menggunakan click_action. Anda hanya perlu mendapatkan ujian dari niat pada aktivitas PELUNCUR

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

Kode Java harus menggunakan metode onCreate di MainActivity:

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

Anda dapat menguji kedua notifikasi + data payload dari Firebase Notifications Console . Jangan lupa untuk mengisi bidang data khusus pada bagian Opsi lanjutan

Mihuilk
sumber
14

Berikut adalah konsep yang lebih jelas tentang pesan firebase. Saya menemukannya dari tim dukungan mereka.

** Firebase memiliki tiga jenis pesan **:

Pesan pemberitahuan : Pesan pemberitahuan berfungsi di latar belakang atau latar depan. Saat aplikasi di latar belakang, pesan pemberitahuan dikirim ke baki sistem. Jika aplikasi di latar depan, pesan akan ditangani oleh onMessageReceived()atau didReceiveRemoteNotificationdipanggil kembali. Ini pada dasarnya adalah apa yang disebut sebagai pesan tampilan.

Pesan data : Pada platform Android, pesan data dapat bekerja di latar belakang dan latar depan. Pesan data akan ditangani oleh onMessageReceived (). Catatan khusus platform di sini adalah: Di Android, muatan data dapat diambil di Intent yang digunakan untuk meluncurkan aktivitas Anda. Untuk menguraikan, jika sudah "click_action":"launch_Activity_1", Anda dapat mengambil maksud ini getIntent()hanya dari Activity_1.

Pesan dengan notifikasi dan muatan data : Ketika di latar belakang, aplikasi menerima muatan notifikasi di baki notifikasi, dan hanya menangani muatan data ketika pengguna mengetuk notifikasi. Saat berada di latar depan, aplikasi Anda menerima objek pesan dengan kedua payload tersedia. Kedua, click_actionparameter ini sering digunakan dalam payload pemberitahuan dan tidak dalam payload data. Jika digunakan di dalam payload data, parameter ini akan diperlakukan sebagai pasangan nilai kunci khusus dan oleh karena itu Anda perlu menerapkan logika khusus agar dapat berfungsi sebagaimana dimaksud.

Juga, saya sarankan Anda untuk menggunakan onMessageReceivedmetode (lihat Pesan data) untuk mengekstrak bundel data. Dari logika Anda, saya memeriksa objek bundel dan belum menemukan konten data yang diharapkan. Berikut ini adalah referensi ke kasus serupa yang mungkin memberikan lebih banyak kejelasan.

Untuk info lebih lanjut, kunjungi utas saya ini

Md. Sajedul Karim
sumber
8

Ringkasan sederhana seperti ini

  • jika aplikasi Anda berjalan;

    onMessageReceived()

adalah pemicu.

  • jika aplikasi Anda tidak berjalan (terbunuh oleh gesekan);

    onMessageReceived()

tidak dipicu dan dikirim oleh direclty. Jika Anda memiliki pasangan nilai kunci khusus. Mereka tidak bekerja karena onMessageReceived () tidak berfungsi.

Saya telah menemukan cara ini;

Dalam aktivitas peluncur Anda, masukkan logika ini,

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

di blok if ini, cari kunci Anda sesuai dengan firebase UI.

Dalam contoh ini kunci dan nilai saya seperti di atas; (maaf untuk bahasa =)) masukkan deskripsi gambar di sini

Ketika kode saya berfungsi, saya mendapatkan "com.rda.note".

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

dengan baris kode ini, saya menutup aplikasi saya dan membuka Google Play Market

selamat coding =)

Arda
sumber
6

Saya menemukan skenario,

Ketika aplikasi di latar depan , metode onMessageReceived () dipanggil dari FirebaseService . Jadi pendingIntent yang didefinisikan dalam kelas layanan akan dipanggil.

Dan ketika aplikasi di latar belakang , aktivitas pertama disebut.

Sekarang, jika Anda menggunakan aktivitas splash , maka harus diingat splashactivity akan dipanggil, jika tidak ada splashActivity, maka apa pun aktivitas pertama adalah, akan dipanggil.

Maka Anda perlu memeriksa getIntent () dari firstActivity untuk melihat apakah ia memiliki bundel. Jika semuanya baik-baik saja, Anda akan melihat bundel apakah ada nilai yang diisi. Jika nilai dalam tag data yang dikirim dari server terlihat seperti ini,

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

Kemudian pada aktivitas pertama, Anda akan melihat, ada maksud yang valid ( getIntent () bukan nol ), bundel yang valid dan bundel yang dalam, akan ada seluruh JSON yang disebutkan di atas dengan data sebagai kunci .

Untuk skenario ini, kode untuk ekstraksi nilai akan terlihat seperti ini,

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


            }
        }
Shamsul Arefin Sajib
sumber
3

Terima kasih untuk semua atas jawaban Anda. Tapi saya menyelesaikan ini dengan mengirim pesan data alih-alih mengirim Pemberitahuan . Kode server

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

?>

Dan menangkap Data di onMessageReceived

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());
}
}
Android Sanaullah
sumber
1
apakah ini bekerja dengan latar belakang juga?
Tabish khan
@Tabishkhan Ya saudara itu berfungsi jika Anda memiliki masalah jangan ragu untuk bertanya kepada saya .. terima kasih
Android Sanaullah
1
hai @AndroidSanaullah, bisakah Anda menjelaskan bagian pertama kode server, di mana Anda benar-benar meletakkannya, saya menghadapi masalah yang sama tetapi saya tidak begitu memahami bagian server, apakah Anda menggunakan tukang pos?
Shid
curl digunakan untuk permintaan dan semua parameter diteruskan ke. @ Shid
Android Sanaullah
2

Hapus muatan notifikasi sepenuhnya dari permintaan server Anda. Kirim hanya data dan tangani onMessageReceived(), jika tidak, Anda onMessageReceivedtidak akan terpicu ketika aplikasi di latar belakang atau terbunuh.

Inilah yang saya kirim dari server:

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

Jadi, Anda dapat menerima data Anda onMessageReceived(RemoteMessage message)seperti ini: (katakanlah saya harus mendapatkan id)

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

Dan juga Anda bisa mendapatkan data apa pun yang telah Anda kirim dari server di dalamnya onMessageReceived().

Zohab Ali
sumber
2

Cara mudah untuk mengirim pesan meskipun aplikasi berada di latar belakang dan latar depan sebagai berikut: - Untuk mengirim pesan menggunakan API, Anda dapat menggunakan alat yang disebut AdvancedREST Client, ekstensi kromnya, dan mengirim pesan dengan parameter berikut.

Tautan alat klien sisanya: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

gunakan url ini: - https://fcm.googleapis.com/fcm/send Jenis-Konten: application / json Otorisasi: key = Kunci Server Anda Dari atau Kunci autoisasi (lihat ref di bawah)

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

Kunci otorisasi dapat diperoleh dengan mengunjungi konsol pengembang Google dan mengklik tombol Kredensial pada menu sebelah kiri untuk proyek Anda. Di antara kunci API yang tercantum, kunci server akan menjadi kunci otorisasi Anda.

Dan Anda perlu memasukkan tokenID penerima di bagian "to" dari permintaan POST Anda yang dikirim menggunakan API.

Syed Danish Haider
sumber
2

Anda ingin bekerja diMessageReceived (RemoteMessage remoteMessage) di latar belakang hanya mengirim data bagian pemberitahuan bagian ini:

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

"AnotherActivity": "True", "to": "device id Atau token Perangkat"

Dengan ini onMessageRecivied adalah latar belakang panggilan dan latar depan tidak perlu menangani pemberitahuan menggunakan baki pemberitahuan pada aktivitas peluncur Anda. Tangani payload data dalam menggunakan ini:

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

Jawaban Juni 2018 -

Anda harus memastikan bahwa tidak ada kata kunci "pemberitahuan" di mana pun dalam pesan. Hanya sertakan "data", dan aplikasi akan dapat menangani pesan di onMessageReceived, bahkan jika di latar belakang atau dibunuh.

Menggunakan Fungsi Cloud:

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

Kemudian di onMessageReceived () Anda, di kelas Anda memperluas com.google.firebase.messaging.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.
Jeff Padgett
sumber
apakah Anda punya sumber, aman?
Yogesh Rathi
Aman, saya menggunakannya di aplikasi saya. Namun, 6 bulan sejak posting, saya tidak dapat mengingat sumbernya - saya kira itu adalah dokumentasi firebase.
Jeff Padgett
1

Menurut OAUTH 2.0:

Akan ada masalah Auth untuk kasus ini karena FCM sekarang menggunakan OAUTH 2

Jadi saya membaca dokumentasi firebase dan menurut dokumentasi cara baru untuk mengirim pesan data adalah;

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

Tajuk

Key: Content-Type, Value: application/json

Auth

Bearer YOUR_TOKEN 

Tubuh contoh

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

Di url ada Database Id yang dapat Anda temukan di firebase console Anda. (Pergi penyelesaian proyek)

Dan sekarang mari kita ambil token kami (Ini hanya akan berlaku 1 jam):

Pertama di Firebase console, buka Pengaturan> Akun Layanan . Klik Hasilkan Kunci Pribadi Baru , simpan file JSON dengan aman yang berisi kunci tersebut. Saya membutuhkan file JSON ini untuk mengotorisasi permintaan server secara manual. Saya mengunduhnya.

Kemudian saya membuat proyek node.js dan menggunakan fungsi ini untuk mendapatkan token saya;

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

Sekarang saya dapat menggunakan token ini dalam permintaan posting saya. Lalu saya memposting pesan data saya, dan sekarang ditangani oleh aplikasi saya pada fungsiMessageReceived.

Ozan
sumber
Jawaban yang diterima berfungsi, token barer bukan cara, Anda perlu membaca ini untuk mencobanya dengan Postman: stackoverflow.com/questions/45309674/…
Carlos Jesus Arancibia Taborga
1

Sejak 2019, Google Firebase memiliki perubahan besar dalam API mereka yang saya maksud: 'com.google.firebase:firebase-messaging:18.0.0'

di 18.0.0 mereka dihapus MyFirebaseInstanceIDServicedan Anda harus mendapatkan token MyFirebaseMessagingServicesehingga Anda hanya perlu menulis:

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

}

dan juga di AndroidManifest.xml Anda, Anda harus menghapus:

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

Selain itu, Anda disarankan untuk menetapkan nilai default untuk menyesuaikan tampilan pemberitahuan. Anda dapat menentukan ikon default khusus dan warna default kustom yang diterapkan setiap kali nilai yang setara tidak diatur dalam muatan notifikasi.

Tambahkan baris ini di dalam tag aplikasi untuk mengatur ikon default kustom dan warna kustom:

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

sekarang untuk menangani pesan notifikasi di aplikasi latar belakang Anda harus menentukan Intent di Aktivitas pertama Anda meskipun itu adalah SplashScreen, Ketika aplikasi Anda di latar belakang, Android mengarahkan pesan notifikasi ke baki sistem. Ketuk pengguna pada notifikasi membuka peluncur aplikasi secara default.

misalnya, jika Json Anda seperti ini:

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

Anda hanya perlu menulis maksud sederhana untuk mendapatkan nilai-nilai tersebut:

        Bundle extras = intent.getExtras();
        String bannerLink = extras.getString("bannerLink");
        ...
        String channelId = extras.getString("channelId");
Mohammad Mirzakhani
sumber
0

Selain jawaban di atas, Jika Anda menguji pemberitahuan push menggunakan konsol FCM , kunci dan objek 'data' tidak ditambahkan ke bundel Pemberitahuan Push. Jadi, Anda tidak akan menerima pemberitahuan push terperinci saat Aplikasi latar belakang atau terbunuh.

Dalam hal ini Anda harus memilih konsol admin ujung belakang Anda untuk menguji skenario latar belakang aplikasi.

Di sini, Anda akan menambahkan kunci 'data' ke bundel push Anda. jadi, detail push akan ditampilkan seperti yang diharapkan. Semoga ini bisa membantu sedikit.

Max Droid
sumber
0

Dengan menggunakan kode ini Anda bisa mendapatkan notifikasi di latar belakang / latar depan dan juga melakukan tindakan:

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

Dalam Aplikasi gunakan kode ini:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }
Ashish Kumar
sumber
// Data harus datang dalam format ini dari pemberitahuan {"ke": "/ xyz / Notifikasi", "data": {"key1": "pemberitahuan judul", "key2": "deskripsi pemberitahuan"}} Cara menulis kode ini di layanan php?
Tabish khan
-3

Akan ada dua jenis notifikasi

  1. Tampilan Pemberitahuan - Hanya pemberitahuan tampilan, akan ditampilkan hanya aplikasi yang tidak terbuka dan ada di tumpukan aplikasi.
  2. Notifikasi Data - panggilan balik akan masuk ke metode onMessageReceived dari layanan firebasemessagings dan bekerja ketika aplikasi berada di latar belakang, latar depan atau keadaan terbunuh.

Anda harus menggunakan Notifikasi Data untuk menangani notifikasi ketika aplikasi di latar belakang.

abhi.nalavade
sumber
-5

Saya mengalami masalah yang sama dan mengkompilasi ulang pustaka firebase dan mencegahnya mengirim pemberitahuan saat aplikasi di latar belakang

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

semoga membantu. Semoga berhasil

Erdal CEYLAN
sumber
2
Jawaban tidak berguna
Ankit Patidar
2
Ini saran yang mengerikan.
vsecades