Saya bekerja dengan Firebase dan menguji pengiriman pemberitahuan ke aplikasi saya dari server saya saat aplikasi di latar belakang. Pemberitahuan berhasil dikirim, bahkan muncul di pusat notifikasi perangkat, tetapi ketika pemberitahuan muncul atau bahkan jika saya mengkliknya, metode onMessageReceived di dalam FCMessagingService saya tidak pernah dipanggil.
Ketika saya menguji ini ketika aplikasi saya berada di latar depan, metode onMessageReceived dipanggil dan semuanya bekerja dengan baik. Masalahnya terjadi ketika aplikasi berjalan di latar belakang.
Apakah ini perilaku yang dimaksudkan, atau adakah cara saya bisa memperbaikinya?
Inilah FBMessagingService saya:
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class FBMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i("PVL", "MESSAGE RECEIVED!!");
if (remoteMessage.getNotification().getBody() != null) {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
} else {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
}
}
}
android
firebase
firebase-cloud-messaging
Cyogenos
sumber
sumber
Jawaban:
Ini berfungsi sebagaimana mestinya, pesan pemberitahuan dikirim ke panggilan balik onMessageReceived Anda hanya ketika aplikasi Anda di latar depan. Jika aplikasi Anda berada di latar belakang atau ditutup maka pesan pemberitahuan ditampilkan di pusat pemberitahuan, dan data apa pun dari pesan itu diteruskan ke maksud yang diluncurkan sebagai hasil dari pengguna mengetuk pemberitahuan tersebut.
Anda dapat menentukan click_action untuk menunjukkan niat yang harus diluncurkan ketika pemberitahuan diketuk oleh pengguna. Aktivitas utama digunakan jika tidak ada click_action yang ditentukan.
Saat niat diluncurkan, Anda dapat menggunakan
untuk mengambil Set yang akan menyertakan data yang dikirim bersama dengan pesan notifikasi.
Untuk lebih lanjut tentang pesan pemberitahuan, lihat dokumen .
sumber
click_action
kapan saya menggunakan Firebase Notification Console?Hapus
notification
bidang sepenuhnya dari permintaan server Anda. Kirim sajadata
dan tanganionMessageReceived()
jika tidak, AndaonMessageReceived()
tidak akan dipicu ketika aplikasi di latar belakang atau terbunuh.Jangan lupa untuk memasukkan
"priority": "high"
bidang dalam permintaan pemberitahuan Anda. Menurut dokumentasi: pesan data dikirim dengan prioritas normal, sehingga mereka tidak akan tiba secara instan; bisa juga itu masalahnya.Inilah yang saya kirim dari server
Jadi Anda dapat menerima data Anda
onMessageReceived(RemoteMessage message)
seperti ini .... katakanlah saya harus mendapatkan idsumber
metode ini handleIntent () telah didepresiasi, jadi penanganan notifikasi dapat dilakukan seperti di bawah ini:
Status Latar Depan: Klik notifikasi akan menuju ke aktivitas Intent yang tertunda yang Anda sediakan saat membuat notifikasi pro-gramatikal seperti yang umumnya dibuat dengan muatan data notifikasi.
Latar Belakang / Status Terbunuh - Di sini, sistem itu sendiri membuat notifikasi berdasarkan muatan notifikasi dan mengklik notifikasi itu akan membawa Anda ke aktivitas peluncur aplikasi tempat Anda dapat dengan mudah mengambil data Intent dalam salah satu metode siklus hidup Anda.
sumber
OnMessageReceived
dalam kasus ini!?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, parameter click_action sering digunakan dalam muatan notifikasi dan bukan dalam muatan 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 berfungsi sesuai yang diinginkan.
Juga, saya sarankan Anda untuk menggunakan metode onMessageReceived (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 untuk kasus serupa yang mungkin memberikan lebih banyak kejelasan.
Dari sisi server, pemberitahuan firebase harus di bawah format :
Sisi server harus mengirim objek "pemberitahuan" . Kurangnya objek "pemberitahuan" di saya
TargetActivity
tidak mendapatkan pesan menggunakangetIntent()
.Format pesan yang benar diberikan di bawah ini:
Berikut adalah konsep yang lebih jelas tentang pesan firebase. Saya menemukannya dari tim dukungan mereka.
Untuk info lebih lanjut, kunjungi utas saya dan utas ini
sumber
Saya memiliki masalah yang sama. Lebih mudah menggunakan 'pesan data' daripada 'notifikasi'. Pesan data selalu memuat kelas onMessageReceived.
Di kelas itu Anda dapat membuat notifikasi sendiri dengan pembuat notifikasi.
Contoh:
sumber
Sesuai dokumentasi Firebase Cloud Messaging-Jika Kegiatan di latar depan maka onMessageReceived akan dipanggil. Jika Kegiatan di latar belakang atau tertutup maka pesan pemberitahuan ditampilkan di pusat pemberitahuan untuk aktivitas peluncur aplikasi. Anda dapat memanggil aktivitas khusus Anda dengan mengklik pemberitahuan jika aplikasi Anda ada di latar belakang dengan memanggil api layanan sisanya untuk pesan berbasis firebase sebagai:
URL- https://fcm.googleapis.com/fcm/send
Jenis Metode - POST
Tubuh / Muatan:
Dan dengan ini di aplikasi Anda, Anda dapat menambahkan kode di bawah ini dalam aktivitas Anda untuk dipanggil:
sumber
onMessageReceived
?Metode onMessageReceived (RemoteMessage remoteMessage) dipanggil berdasarkan kasus-kasus berikut.
onMessageReceived (RemoteMessage remoteMessage) disebut, menampilkan LargeIcon dan BigPicture di bilah notifikasi. Kita dapat membaca konten dari notifikasi dan blok data
onMessageReceived (RemoteMessage remoteMessage) tidak dipanggil, system tray akan menerima pesan dan membaca isi dan judul dari blok notifikasi dan menampilkan pesan dan judul default di bilah notifikasi.
Dalam hal ini, menghapus blok notifikasi dari json
Solusi untuk memanggil onMessageReceived ()
onMessageReceived (RemoteMessage remoteMessage) disebut, menampilkan LargeIcon dan BigPicture di bilah notifikasi. Kita dapat membaca konten dari notifikasi dan blok data
onMessageReceived (RemoteMessage remoteMessage) disebut, system tray tidak akan menerima pesan karena kunci notifikasi tidak ada dalam respons. Memperlihatkan LargeIcon dan BigPicture di bilah notifikasi
Kode
Tautan Referensi:
https://firebase.google.com/docs/cloud-messaging/android/receive
sumber
Saya mendapat masalah yang sama. Jika aplikasi ini foreground - memicu layanan latar belakang saya di mana saya dapat memperbarui database saya berdasarkan jenis notifikasi. Tapi, aplikasi pergi ke latar belakang - layanan notifikasi default akan berhati-hati untuk menunjukkan notifikasi kepada pengguna.
Inilah solusi saya untuk mengidentifikasi aplikasi di latar belakang dan memicu layanan latar belakang Anda,
Di manifes.xml
Menguji solusi ini dalam versi android 8.0 terbaru. Terima kasih
sumber
WakefulBroadcastReceiver
tidak digunakan lagi sejak API level 26.1.0.Jika aplikasi dalam modus latar belakang atau tidak aktif (dibunuh), dan Anda klik pada Pemberitahuan , Anda harus memeriksa muatan di LaunchScreen (di saya layar kasus peluncuran adalah MainActivity.java).
Jadi di MainActivity.java pada onCreate periksa Ekstra :
sumber
Timpa
handleIntent
MetodeFirebaseMessageService
karya untuk saya.di sini kode dalam C # (Xamarin)
dan itulah Kode di Jawa
sumber
Secara default Aktivitas Peluncur di aplikasi Anda akan diluncurkan ketika aplikasi Anda di latar belakang dan Anda mengklik pemberitahuan, jika Anda memiliki bagian data dengan pemberitahuan Anda, Anda dapat menanganinya dalam aktivitas yang sama seperti berikut,
sumber
Jika aplikasi berada di latar belakang Fire-base secara default menangani notifikasi Tetapi jika kita ingin notifikasi custom kita daripada kita harus mengubah sisi server kita, yang bertanggung jawab untuk mengirim data kustom kita (payload data)
Hapus muatan notifikasi sepenuhnya dari permintaan server Anda. Kirim hanya Data dan tangani di onMessageReceived () jika tidak onMessageReceived Anda tidak akan terpicu ketika aplikasi di latar belakang atau dibunuh.
sekarang, format kode sisi server Anda terlihat seperti,
CATATAN : lihat baris ini dalam kode di atas
"teks": "John Doe berbagi kontak di grup Kontak Exchange" dalam data payload, Anda harus menggunakan parameter "text" daripada parameter "body" atau "message" untuk deskripsi pesan atau apa pun yang Anda ingin menggunakan teks.
onMessageReceived ()
sumber
Sebut saja ini di Metode onCreate MainActivity Anda:
sumber
menurut solusi dari t3h Exi saya ingin memposting kode bersih di sini. Masukkan saja ke MyFirebaseMessagingService dan semuanya berfungsi dengan baik jika aplikasi berada dalam mode latar belakang. Anda setidaknya perlu mengkompilasi com.google.firebase: firebase-messaging: 10.2.1
sumber
Coba ini:
sumber
Saya mengalami masalah ini (aplikasi tidak ingin membuka pada klik pemberitahuan jika aplikasi di latar belakang atau tertutup), dan masalahnya adalah tidak valid
click_action
di badan pemberitahuan, coba hapus atau ubah menjadi sesuatu yang valid.sumber
Poin yang patut disorot adalah bahwa Anda harus menggunakan pesan data - hanya data kunci - untuk mendapatkan handler onMessageReceived dipanggil bahkan ketika aplikasi di latar belakang. Anda seharusnya tidak memiliki kunci pesan pemberitahuan lainnya di payload Anda, jika tidak pawang tidak akan dipicu jika aplikasi di latar belakang.
Disebutkan (tetapi tidak begitu ditekankan dalam dokumentasi FCM) di sini:
https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
sumber
Backend saya bekerja dengan menggunakan pesan Notifikasi dan bukan pesan Data. Jadi setelah membaca semua jawaban saya mencoba mengambil ekstra dari bundel niat yang datang ke aktivitas yang diluncurkan. Tapi tidak peduli kunci mana yang saya coba ambil
getIntent().getExtras();
, nilainya selalu nol.Namun, saya akhirnya menemukan cara untuk mengirim data menggunakan pesan Notifikasi dan mengambilnya dari maksud.
Kuncinya di sini adalah menambahkan muatan data ke pesan Pemberitahuan.
Contoh:
Setelah Anda melakukan ini, Anda akan bisa mendapatkan info dengan cara ini:
intent.getExtras().getString("title")
akanmessage_title
dan
intent.getExtras().getString("message")
akanmessage_body
Referensi
sumber
Jika masalah Anda terkait dengan menampilkan Gambar Besar yaitu jika Anda mengirim pemberitahuan push dengan gambar dari konsol berbasis firebase dan itu akan menampilkan gambar hanya jika aplikasi di latar depan. Solusi untuk masalah ini adalah mengirim pesan push dengan hanya bidang data. Sesuatu seperti ini:
sumber
Ketika pesan diterima dan aplikasi Anda di latar belakang, pemberitahuan dikirim ke maksud ekstra dari kegiatan utama.
Anda dapat memeriksa nilai tambahan di fungsi oncreate () atau onresume () dari aktivitas utama.
Anda dapat memeriksa bidang-bidang seperti data, tabel dll (yang ditentukan dalam pemberitahuan)
misalnya saya kirim menggunakan data sebagai kuncinya
sumber
Saya mengalami masalah yang sama dan melakukan beberapa penggalian lebih lanjut tentang ini. Ketika aplikasi di latar belakang, pesan pemberitahuan dikirim ke baki sistem, TETAPI pesan data dikirim ke
onMessageReceived()
Lihat https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
dan https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java
Untuk memastikan bahwa pesan yang Anda kirim, dokumen mengatakan, " Gunakan server aplikasi Anda dan API server FCM: Tetapkan kunci data saja. Dapat dilipat atau tidak dilipat. "
Lihat https://firebase.google.com/ docs / cloud-messaging / concept-options # notification_and_data_messages
sumber
Ada dua jenis pesan: pesan pemberitahuan dan pesan data. Jika Anda hanya mengirim pesan data, itu tanpa objek notifikasi di string pesan Anda. Itu akan dipanggil ketika aplikasi Anda di latar belakang.
sumber
Periksa jawaban @Mahesh Kavathiya. Untuk kasus saya, dalam kode server hanya seperti ini:
Anda perlu mengubah ke:
Lalu, jika ada aplikasi di Latar Belakang, ekstra maksud aktivitas default akan mendapatkan "data"
Semoga berhasil!
sumber
Cukup timpa metode OnCreate dari FirebaseMessagingService. Disebut ketika aplikasi Anda di latar belakang:
sumber
Ada 2 jenis dari Firebase push-notifikasi:
1- Pesan pemberitahuan (Pesan tampilan) -> - 1.1 Jika Anda memilih varian ini, OS akan membuat pemberitahuan sendiri jika aplikasi ada di Latar Belakang dan akan meneruskan data di
intent
. Maka terserah klien untuk menangani data ini.- 1.2 Jika aplikasi berada di Foreground maka pemberitahuan itu akan diterima melalui
callback-function
diFirebaseMessagingService
dan terserah klien untuk menanganinya.2- Pesan data (hingga data 4k) -> Pesan-pesan ini digunakan untuk hanya mengirim data ke klien (diam-diam) dan terserah klien untuk menanganinya untuk kedua kasus latar belakang / latar depan melalui fungsi panggil balik di
FirebaseMessagingService
Ini sesuai dengan dokumen resmi: https://firebase.google.com/docs/cloud-messaging/concept-options
sumber