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