| اختيار النظام الأساسي: | iOS+ Android الويب Flutter Unity C++ |
لتلقّي الرسائل، يمكنك استخدام خدمة توسّع نطاق FirebaseMessagingService.
يجب أن تلغي الخدمة عمليات الاستدعاء onMessageReceived وonDeletedMessages. للاطّلاع على مثال كامل، يمكنك مراجعة نموذج البدء السريع لخدمة "مراسلة Firebase السحابية".
يتم توفير onMessageReceived لمعظم أنواع الرسائل، باستثناء ما يلي:
رسائل الإشعارات التي يتم تسليمها عندما يكون تطبيقك في الخلفية وفي هذه الحالة، يتم عرض الإشعار في لوحة النظام على الجهاز. عندما ينقر المستخدم على إشعار، يتم فتح مشغّل التطبيقات تلقائيًا.
الرسائل التي تتضمّن حمولة بيانات وإشعارات عند تلقّيها في الخلفية في هذه الحالة، يتم تسليم الإشعار إلى صينية النظام بالجهاز، ويتم تسليم حمولة البيانات في إضافات Intent الخاصة بنشاط المشغّل.
وباختصار:
| حالة التطبيق | إشعار | البيانات | كلاهما |
|---|---|---|---|
| واجهة | onMessageReceived |
onMessageReceived |
onMessageReceived |
| الخلفية | لوحة النظام | onMessageReceived |
الإشعار: علبة النظام البيانات: في الإضافات الخاصة بالintent. |
لمزيد من المعلومات حول أنواع الرسائل، يُرجى الاطّلاع على الإشعارات ورسائل البيانات.
تتوفّر فترة تنفيذ قصيرة لعملية الاستدعاء onMessageReceived. يمكن أن تؤثر العديد من العوامل في مدة هذه النافذة، بما في ذلك تأخيرات نظام التشغيل أو وقت بدء تشغيل التطبيق أو حظر سلسلة التعليمات الرئيسية بسبب عمليات أخرى أو استغراق طلبات onMessageReceived السابقة وقتًا طويلاً.
لهذا السبب، يجب تجنُّب المهام التي تستغرق وقتًا طويلاً (مثل جلب الصور من خادم لعرضها في إشعار) في onMessageReceived، وبدلاً من ذلك، يمكنك جدولة مهمة باستخدام WorkManager لمعالجة أي مهام قد تستغرق أكثر من بضع ثوانٍ لإكمالها. لمزيد من المعلومات حول أولوية الرسالة وتأثيرها في المعالجة، يُرجى الاطّلاع على معالجة الرسائل ذات الأولوية العالية والعادية.
تعديل ملف بيان التطبيق
لاستخدام FirebaseMessagingService، عليك إضافة ما يلي في بيان تطبيقك:
<service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
ننصحك بضبط القيم التلقائية لتخصيص مظهر الإشعارات. يمكنك تحديد رمز تلقائي مخصّص ولون تلقائي مخصّص يتم تطبيقهما في حال عدم ضبط قيم مكافئة في حمولة الإشعار.
أضِف الأسطر التالية داخل علامة application لضبط الرمز التلقائي المخصّص واللون المخصّص:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
يعرض Android الرمز التلقائي المخصّص ويستخدمه في
جميع رسائل الإشعارات التي يتم إرسالها من أداة إنشاء الإشعارات في وحدة تحكّم Firebase
أي رسالة إشعار لا تحدّد الرمز بشكل صريح في حمولة الإشعار
إذا لم يتم ضبط رمز تلقائي مخصّص ولم يتم ضبط رمز في حمولة الإشعار، يعرض نظام التشغيل Android رمز التطبيق باللون الأبيض.
إلغاء onMessageReceived
من خلال إلغاء الطريقة FirebaseMessagingService.onMessageReceived، يمكنك
تنفيذ إجراءات استنادًا إلى عنصر
RemoteMessage الذي تم تلقّيه
والحصول على بيانات الرسالة:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // 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. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ 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()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // 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. }
تجاهل onDeletedMessages
في بعض الحالات، قد لا يتمكّن FCM من إرسال رسالة. يحدث ذلك عندما يكون هناك عدد كبير جدًا من الرسائل المعلقة (> 100) لتطبيقك على جهاز معيّن عند اتصاله بالإنترنت أو إذا لم يتصل الجهاز بخدمة FCM لأكثر من شهر واحد. في هذه الحالات، قد تتلقّى رد اتصال على FirebaseMessagingService.onDeletedMessages(). عندما يتلقّى مثيل التطبيق ردّ الاتصال هذا، عليه إجراء مزامنة كاملة مع خادم التطبيق. إذا لم ترسل رسالة إلى التطبيق على هذا الجهاز خلال آخر 4 أسابيع، لن يتصل "FCM" بـ "onDeletedMessages()".
التعامل مع رسائل الإشعارات في تطبيق يعمل في الخلفية
عندما يكون تطبيقك في الخلفية، يوجّه Android رسائل الإشعارات إلى لوحة النظام. عندما ينقر المستخدم على الإشعار، يتم فتح مشغّل التطبيقات تلقائيًا.
ويشمل ذلك الرسائل التي تحتوي على حمولة بيانات وإشعارات (وجميع الرسائل المُرسَلة من "منشئ الإشعارات" في وحدة تحكّم Firebase). في هذه الحالات، يتم تسليم الإشعار إلى علبة النظام بالجهاز، ويتم تسليم حمولة البيانات في إضافات Intent الخاصة بنشاط المشغّل.
للحصول على إحصاءات حول عملية تسليم الرسائل إلى تطبيقك، انتقِل إلى لوحة بيانات عمليات التشغيل والتطوير والتفاعل > المراسلة > التقارير في وحدة تحكّم Firebase. تسجّل لوحة البيانات هذه عدد الرسائل المُرسَلة والمفتوحة على أجهزة Apple وAndroid، بالإضافة إلى بيانات "مرّات الظهور" (الإشعارات التي يراها المستخدمون) لتطبيقات Android.