| اختيار المنصة: | iOS+ Android الويب Flutter Unity C++ |
لتلقّي الرسائل، يمكنك استخدام خدمة توسّع نطاق FirebaseMessagingService.
يجب أن تتجاهل خدمتك عمليات الاسترجاع onMessageReceived وonDeletedMessages. للاطّلاع على مثال كامل، راجِع نموذج التشغيل السريع لخدمة "مراسلة Firebase السحابية".
يتم توفير onMessageReceived لمعظم أنواع الرسائل، باستثناء ما يلي:
رسائل الإشعارات التي يتم تسليمها عندما يكون تطبيقك في الخلفية في هذه الحالة، يتم عرض الإشعار في لوحة النظام على الجهاز. عندما ينقر المستخدم على إشعار، يتم فتح مشغّل التطبيقات تلقائيًا.
الرسائل التي تتضمّن حمولة بيانات وإشعارات معًا، عند تلقّيها في الخلفية في هذه الحالة، يتم تسليم الإشعار إلى صينية النظام بالجهاز، ويتم تسليم حمولة البيانات في إضافات Intent الخاصة بنشاط المشغّل.
وباختصار:
| حالة التطبيق | إشعار | البيانات | كلاهما |
|---|---|---|---|
| المقدّمة | onMessageReceived |
onMessageReceived |
onMessageReceived |
| الخلفية | لوحة النظام | onMessageReceived |
الإشعار: علبة النظام البيانات: في إضافات الهدف |
لمزيد من المعلومات عن أنواع الرسائل، يُرجى الاطّلاع على الإشعارات ورسائل البيانات.
تتوفّر فترة تنفيذ قصيرة للدالة 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(). عندما يتلقّى مثيل التطبيق دالة رد الاتصال هذه، يجب أن ينفّذ عملية مزامنة كاملة مع خادم تطبيقك. إذا لم ترسل رسالة إلى التطبيق على هذا الجهاز خلال الأسابيع الأربعة الماضية، لن تتصل FCM بـ onDeletedMessages().
التعامل مع رسائل الإشعارات في تطبيق يعمل في الخلفية
عندما يكون تطبيقك يعمل في الخلفية، يوجّه نظام التشغيل Android رسائل الإشعارات إلى لوحة النظام. عندما ينقر المستخدم على الإشعار، يتم فتح مشغّل التطبيقات تلقائيًا.
ويشمل ذلك الرسائل التي تحتوي على كل من الإشعار وحِمل البيانات (وجميع الرسائل المرسَلة من أداة إنشاء الإشعارات في وحدة تحكّم Firebase). في هذه الحالات، يتم تسليم الإشعار إلى علبة النظام بالجهاز، ويتم تسليم حمولة البيانات في إضافات Intent الخاصة بنشاط المشغّل.
للحصول على إحصاءات حول عملية تسليم الرسائل إلى تطبيقك، انتقِل إلى لوحة بيانات التقارير في قسم عمليات التشغيل والتفاعل > المراسلة في وحدة تحكّم Firebase. تسجّل لوحة البيانات هذه عدد الرسائل التي تم إرسالها وفتحها على أجهزة Apple وAndroid، بالإضافة إلى بيانات "مرات الظهور" (الإشعارات التي يراها المستخدمون) لتطبيقات Android.