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 onMessageReceived
kode 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]
android
firebase
firebase-cloud-messaging
Parth Patel
sumber
sumber
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 payloadJawaban:
1. Mengapa ini terjadi?
Ada dua jenis pesan dalam FCM (Firebase Cloud Messaging):
onMessageReceived()
panggilan balik hanya ketika aplikasi Anda di latar depanonMessageReceived()
panggilan balik bahkan jika aplikasi Anda di latar depan / latar belakang / terbunuh2. Bagaimana caranya?
Untuk mencapai ini, Anda harus melakukan
POST
permintaan ke URL berikut:Tajuk
Content-Type
, Nilai:application/json
Authorization
, Nilai:key=<your-server-key>
Tubuh menggunakan topik
Atau jika Anda ingin mengirimnya ke perangkat tertentu
3. Bagaimana cara menangani pesan push notification?
Ini adalah cara Anda menangani pesan yang diterima:
sumber
Firebase team have not developed a UI to send data-messages to your devices, yet.
Apakah ini berubah dalam satu tahun terakhir?onMessageReceived
tidak dipanggil dan ini adalah masalah serius di FCM !!! Harap perbarui jawaban Anda juga.Untuk membuat pustaka firebase untuk memanggil onMessageReceived () Anda dalam kasus berikut
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.
tetapi menggunakan ini akan bekerja
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
sumber
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:
ke aktivitas yang Anda inginkan untuk memproses data notifikasi.
Kirim pemberitahuan dengan format berikutnya:
Kuncinya di sini adalah menambahkan
di mana .MainActivity adalah aktivitas dengan filter maksud yang Anda tambahkan di langkah 1.
Dapatkan info "data" dari notifikasi di onCreate of ".MainActivity":
Dan hanya itu yang harus Anda lakukan. Saya harap ini membantu seseorang :)
sumber
Menurut dokumentasi firebase dalam mengirim hilir menggunakan firebase , ada 2 jenis muatan:
data
pemberitahuan
Ketika Anda berada di latar depan Anda bisa mendapatkan data di dalam FCM menggunakan onMessageReceived () , Anda bisa mendapatkan data dari payload data .
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 .
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 .
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:
Saya menggunakan FCM untuk aplikasi Android saya dan menggunakan kedua payload. Berikut ini contoh JSON yang saya gunakan:
sumber
Menurut dokumen
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
sumber
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:
2- tambahkan baris ini di metode onCreate () dari MainActivity.class Anda
dan metode ini ke MainActivity.class yang sama:
3- buat kelas MyFirebase seperti ini:
4- buat kelas baru NotificationActivity.class seperti ini:
}
5- Tambahkan baris ini ke manifes aplikasi Anda, di dalam tag Anda
6- tambahkan baris ini dalam metode Application.java onCreate () Anda, atau dalam metode MainActivity.class onCreate ():
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!
sumber
Karena
display-messages
yang dikirim dari Firebase Notification UI hanya berfungsi jika aplikasi Anda ada di latar depan. Sebabdata-messages
, ada kebutuhan untuk melakukan panggilan POST ke FCMLangkah
Instal Perpanjangan Klien Lanjutan Google Chrome Extension
Tambahkan tajuk berikut
Kunci : Tipe-Konten, Nilai : application / json
Kunci : Otorisasi, Nilai : key = "kunci server Anda"
Tambahkan tubuh
Jika menggunakan topik:
Jika menggunakan id pendaftaran:
Itu dia!. Sekarang dengarkan
onMessageReceived
callback seperti biasa.sumber
Untuk mengambil pesan di latar belakang, Anda perlu menggunakan a
BroadcastReceiver
dan tambahkan ini ke manifes Anda:
sumber
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
ini metodenya
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
// lakukan apa yang kau inginkan ....}
umumnya ini adalah struktur dari server yang kami terima dalam pemberitahuan
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
sumber
Menurut dokumen: 17 Mei 2017
Jadi, Anda harus menggunakan kedua notifikasi + data payload:
Tidak perlu menggunakan click_action. Anda hanya perlu mendapatkan ujian dari niat pada aktivitas PELUNCUR
Kode Java harus menggunakan metode onCreate di MainActivity:
Anda dapat menguji kedua notifikasi + data payload dari Firebase Notifications Console . Jangan lupa untuk mengisi bidang data khusus pada bagian Opsi lanjutan
sumber
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()
ataudidReceiveRemoteNotification
dipanggil 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 inigetIntent()
hanya dariActivity_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_action
parameter 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
onMessageReceived
metode (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
sumber
2017 jawaban diperbarui
Berikut adalah jawaban yang jelas dari dokumen mengenai hal ini:
sumber
Ringkasan sederhana seperti ini
jika aplikasi Anda berjalan;
adalah pemicu.
jika aplikasi Anda tidak berjalan (terbunuh oleh gesekan);
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,
di blok if ini, cari kunci Anda sesuai dengan firebase UI.
Dalam contoh ini kunci dan nilai saya seperti di atas; (maaf untuk bahasa =))
Ketika kode saya berfungsi, saya mendapatkan "com.rda.note".
dengan baris kode ini, saya menutup aplikasi saya dan membuka Google Play Market
selamat coding =)
sumber
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,
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,
sumber
Terima kasih untuk semua atas jawaban Anda. Tapi saya menyelesaikan ini dengan mengirim pesan data alih-alih mengirim Pemberitahuan . Kode server
Dan menangkap Data di onMessageReceived
sumber
Hapus muatan notifikasi sepenuhnya dari permintaan server Anda. Kirim hanya data dan tangani
onMessageReceived()
, jika tidak, AndaonMessageReceived
tidak akan terpicu ketika aplikasi di latar belakang atau terbunuh.Inilah yang saya kirim dari server:
Jadi, Anda dapat menerima data Anda
onMessageReceived(RemoteMessage message)
seperti ini: (katakanlah saya harus mendapatkan id)Dan juga Anda bisa mendapatkan data apa pun yang telah Anda kirim dari server di dalamnya
onMessageReceived()
.sumber
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)
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.
sumber
Anda ingin bekerja diMessageReceived (RemoteMessage remoteMessage) di latar belakang hanya mengirim data bagian pemberitahuan bagian ini:
"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:
sumber
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:
Kemudian di onMessageReceived () Anda, di kelas Anda memperluas com.google.firebase.messaging.FirebaseMessagingService:
sumber
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;
Tajuk
Auth
Tubuh contoh
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;
Sekarang saya dapat menggunakan token ini dalam permintaan posting saya. Lalu saya memposting pesan data saya, dan sekarang ditangani oleh aplikasi saya pada fungsiMessageReceived.
sumber
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
MyFirebaseInstanceIDService
dan Anda harus mendapatkan tokenMyFirebaseMessagingService
sehingga Anda hanya perlu menulis:dan juga di AndroidManifest.xml Anda, Anda harus menghapus:
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:
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:
Anda hanya perlu menulis maksud sederhana untuk mendapatkan nilai-nilai tersebut:
sumber
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.
sumber
Dengan menggunakan kode ini Anda bisa mendapatkan notifikasi di latar belakang / latar depan dan juga melakukan tindakan:
Dalam Aplikasi gunakan kode ini:
sumber
Akan ada dua jenis notifikasi
Anda harus menggunakan Notifikasi Data untuk menangani notifikasi ketika aplikasi di latar belakang.
sumber
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
*
semoga membantu. Semoga berhasil
sumber