Android المتقدم في Kotlin 01.2: Android Firebase Cloud Messaging

يُعد هذا الدرس التطبيقي جزءًا من الدورة التدريبية المتقدّمة لنظام التشغيل Android في لغة Kotlin. ستحصل على أقصى استفادة من هذه الدورة التدريبية إذا كنت تعمل من خلال الدروس التطبيقية حول الترميز بالتسلسل، ولكن هذا ليس إلزاميًا. يتم إدراج جميع الدروس التطبيقية حول ترميز الدورات التدريبية في الصفحة المقصودة لبرنامج Android المتقدّم في لغة ترميز Kotlin.

مقدمة

في الدرس التطبيقي السابق حول الترميز، أضفت إشعارات إلى موقّت البيض الذي يتم إنشاؤه وتشغيله في تطبيقك. وثمة حالة أخرى مهمة لاستخدام الإشعارات، وهي إرسال إشعارات فورية يمكن استلامها حتى عندما لا يكون تطبيقك قيد التشغيل.

ما المقصود بالإشعارات الفورية؟

الإشعارات الفورية هي إشعارات بأنّ الخادم "دفعة" على الأجهزة الجوّالة. ويمكن تسليمها إلى أحد الأجهزة بغض النظر عما إذا كان تطبيقك قيد التشغيل أم لا.

تُعد الإشعارات الفورية طريقة رائعة لإعلام المستخدمين بتحديث أو تذكيرهم بمهمة أو ميزة. لنفترض أنّ منتجًا متوفّر من جديد. باستخدام الإشعارات الفورية، يمكن أن يُطلعك تطبيق التسوّق على معلومات عن الأسهم بدلاً من التحقق من حالة السهم يوميًا.

تستخدم الإشعارات الفورية نمط النشر/الاشتراك الذي يسمح للتطبيقات الخلفية بإرسال المحتوى ذي الصلة إلى العملاء المهتمين به. بدون نموذج النشر/الاشتراك، سيحتاج مستخدمو تطبيقك إلى التحقّق بشكل دوري من التحديثات في تطبيقك. وهذه العملية مملة وغير موثوق بها للمستخدمين. إضافةً إلى ذلك، ومع ازدياد عدد العملاء، ستُجري عمليات التحقق الدورية هذه عبئًا كبيرًا جدًا على شبكات الاتصال والمعالجة، لكل من خادم التطبيق وجهاز المستخدم.

ومثل جميع الأنواع الأخرى من الإشعارات، احرص على احترام المستخدمين من خلال الإشعارات الفورية. وإذا لم يكن محتوى الإشعار مثيرًا لاهتمامه أو في الوقت المناسب، يمكن للمستخدم إيقاف كل الإشعارات بسهولة من تطبيقك.

ما هي خدمة المراسلة عبر السحابة الإلكترونية من Firebase؟

المراسلة عبر السحابة الإلكترونية من Firebase هي جزء من نظام أساسي من Firebase لتطوير الأجهزة الجوّالة. وعادةً ما تحتاج إلى إعداد خادم من البداية يمكن أن يتصل بالأجهزة الجوّالة لتشغيل الإشعارات. باستخدام خدمة المراسلة في السحابة الإلكترونية من Firebase، يمكنك إرسال الإشعارات إلى جميع مستخدمي التطبيق المثبّتين أو مجموعة فرعية منهم، بدون إعداد خادم. على سبيل المثال، يمكنك إرسال تذكير إلى المستخدمين أو تقديم عرض ترويجي خاص لهم، مثل هدية مجانية.ويمكنك إرسال إشعار عن بُعد إلى جهاز واحد أو أجهزة متعددة.

ويمكنك أيضًا استخدام تطبيق "الرسائل في السحابة الإلكترونية من Firebase" لنقل البيانات من تطبيقك الخلفي أو من مشروع في Firebase إلى المستخدمين.

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" لإرسال إشعارات فورية لتطبيقك المتوافق مع Android، بالإضافة إلى إرسال البيانات.

إذا واجهت أي مشاكل (أخطاء الترميز، أو الأخطاء النحوية، أو الصياغة غير الواضحة، وما إلى ذلك) أثناء معالجة هذا الدرس التطبيقي حول الترميز، يُرجى الإبلاغ عن المشكلة من خلال الرابط الإبلاغ عن خطأ في أسفل يمين الدرس التطبيقي حول الترميز.

ما يجب معرفته

ويجب أن تكون على دراية بما يلي:

  • كيفية إنشاء تطبيقات متوافقة مع Android في Kotlin وعلى وجه الخصوص، يمكنك العمل مع Android SDK.
  • كيفية تصميم تطبيقك باستخدام مكوِّنات البنية وربط البيانات
  • فهم أساسي لأجهزة استقبال البث.
  • فهم أساسي لـ AlarmManager.
  • كيفية إنشاء الإشعارات وإرسالها باستخدام "مدير الإشعارات".

ما ستتعرَّف عليه

  • كيفية إرسال رسائل إلى المستخدم من خلال خدمة المراسلة عبر السحابة الإلكترونية في Firebase.
  • كيفية إرسال البيانات من خلفية إلى تطبيقك باستخدام رسائل البيانات، وهي جزء من خدمة المراسلة عبر السحابة الإلكترونية من Firebase.

الإجراءات التي ستنفذّها

  • يمكنك إضافة الإشعارات الفورية إلى تطبيق إجراء التفعيل.
  • يمكنك التعامل مع خدمة المراسلة عبر السحابة الإلكترونية في Firebase أثناء تشغيل تطبيقك.
  • نقل البيانات باستخدام خدمة المراسلة عبر السحابة الإلكترونية من Firebase.

في هذا الدرس التطبيقي حول الترميز، ستعمل على الرمز الوارد في الدرس السابق "استخدام الإشعارات في تطبيقات Android". في الدرس التطبيقي السابق، صمّمت تطبيقًا يتضمّن موقّت البيض الذي يرسل إشعارات عند انتهاء موقّت الطهي. في هذا الدرس التطبيقي حول الترميز، ستضيف خدمة المراسلة عبر السحابة الإلكترونية من Firebase لإرسال إشعارات فورية إلى مستخدمي تطبيقك لتذكيرهم بتناول البيض.

للحصول على نموذج التطبيق، يمكنك تنفيذ أي مما يلي:

إنشاء نسخة طبق الأصل من المستودع من GitHub والتبديل إلى الفرع Starter:

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications-fcm


بدلاً من ذلك، يمكنك تنزيل المستودع كملف Zip وفك ضغطه وفتحه في"استوديو Android".

تنزيل ملف Zip

الخطوة 1: إنشاء مشروع على Firebase

قبل أن تتمكّن من إضافة Firebase إلى تطبيقك المتوافق مع Android، عليك إنشاء مشروع على Firebase لربطه بتطبيق Android.

  1. سجِّل الدخول إلى وحدة تحكُّم Firebase.
  2. انقر على إضافة مشروع، ثم اختَر اسم مشروع أو أدخِله. أدخِل اسمًا لمشروع fcm-codelab.
  3. انقر على متابعة.
  4. يمكنك تخطّي إعداد "إحصاءات Google" من خلال إيقاف زر تفعيل "إحصاءات Google" لهذا المشروع.
  5. انقر على إنشاء مشروع للانتهاء من إعداد مشروع Firebase.

الخطوة 2: تسجيل تطبيقك في برنامج Firebase

الآن بعد أن أنشأت مشروع Firebase، يمكنك إضافة تطبيقك المتوافق مع Android إليه.

  1. في وسط صفحة النظرة العامة لمشروع وحدة تحكُّم Firebase، انقر على رمز Android لبدء سير عملية الإعداد.

  1. في الحقل اسم حزمة Android، أدخِل com.example.android.eggtimernotifications.
  2. انقر على تسجيل التطبيق.

ملاحظة مهمة: تأكّد من إدخال رقم التعريف الصحيح لتطبيقك لأنه لا يمكنك إضافة هذه القيمة أو تعديلها بعد الانتهاء من تسجيل تطبيقك في مشروع Firebase.

الخطوة 3: إضافة ملف إعداد Firebase إلى مشروعك

أضِف ملف إعداد Firebase لنظام التشغيل Android إلى تطبيقك.

  1. انقر على تنزيل google-services.json للحصول على ملف إعداد Firebase لنظام التشغيل Android (google-services.json). تأكَّد من عدم إلحاق ملف الإعداد بأحرف إضافية ومن تسميته google-services.json بالضبط.
  2. انقِل ملف الإعداد إلى دليل الوحدة (على مستوى التطبيق) لتطبيقك.

الخطوة 4: ضبط مشروع Android لتفعيل منتجات Firebase

لتفعيل منتجات Firebase في تطبيقك، عليك إضافة المكوّن الإضافي google-services إلى ملفات Gradle.

  1. في ملف Gradle على مستوى الجذر (على مستوى المشروع) (build.gradle)، تحقق من أن لديك مستودع Google Maven.
  2. بعد ذلك، يمكنك إضافة قواعد لتضمين المكوّن الإضافي لخدمات Google.

build.gradle

buildscript {

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }

  dependencies {
    // ...

    // Add the following line:
    classpath 'com.google.gms:google-services:4.3.2'  // Google Services plugin
  }
}

allprojects {
  // ...

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    // ...
  }
}
  1. في ملف Gradle الخاص بالوحدة (على مستوى التطبيق) (عادةً app/build.gradle)، أضف سطرًا لتطبيق المكوّن الإضافي في الجزء السفلي من الملف.

app/build.gradle

apply plugin: 'com.android.application'

android {
  // ...
}

// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

في هذه المهمة، ستضيف Firebase Cloud Messaging (FCM) إلى مشروعك للاستفادة من الإشعارات الفورية.

يتم تقديم رمز خدمة Android لـ FCM لهذا الدرس التطبيقي في MyFirebaseMessagingService.kt. في الخطوات التالية، ستضيف رمزًا إلى تطبيقك المتوافق مع Android.

ستستخدم منشئ الإشعارات لاختبار التنفيذ. أداة إنشاء الإشعارات هي أداة تساعدك على إنشاء الرسائل وإرسالها من الموقع الإلكتروني لوحدة تحكُّم Firebase.

  1. فتح MyFirebaseMessagingService.kt
  2. افحص الملف، وبالأخص الوظائف التالية:
  • onNewToken(): يتم الاتصال تلقائيًا إذا كانت الخدمة مسجَّلة في بيان Android. يتم استدعاء هذه الوظيفة عند تشغيل تطبيقك لأول مرة، وفي كل مرة يُصدر فيها Firebase رمز token جديدًا لتطبيقك. يُعد الرمز المميز مفتاح وصول لمشروع خلفية Firebase. يتم إنشاؤها لجهاز العميل المحدد. باستخدام هذا الرمز المميز، يعرف نظام Firebase العميل الذي يجب أن ترسل إليه الخلفية الرسائل. وستعرف Firebase أيضًا ما إذا كان هذا العميل صالحًا ويمكنه الوصول إلى مشروع Firebase هذا.
  • onMessageReceived: يتم الاتصال عندما يكون تطبيقك قيد التشغيل ويرسل Firebase رسالة إلى تطبيقك. وتتلقّى هذه الدالة عنصر RemoteMessage يمكنه حمل إشعار أو حمولة رسالة البيانات. يمكنك الاطّلاع على مزيد من المعلومات حول أوجه الاختلاف بين الإشعارات وأحمال رسائل البيانات لاحقًا في هذا الدرس التطبيقي حول الترميز.

الخطوة 1: إرسال إشعارات المراسلة عبر السحابة الإلكترونية من Firebase إلى جهاز واحد

تتيح لك وحدة تحكّم الإشعارات اختبار إرسال إشعار. لإرسال رسالة إلى جهاز معيّن باستخدام وحدة التحكم، يجب أن تعرف هذا الرمز المميز لتسجيل الجهاز.

عندما تنشئ خلفية Firebase رمزًا مميزًا جديدًا أو جديدًا، سيتم استدعاء دالة onNewToken() مع تمرير الرمز المميز الجديد كوسيطة. إذا كنت تريد استهداف جهاز واحد أو إنشاء مجموعة من الأجهزة التي تريد إرسال رسالة بث إليها، ستحتاج إلى الوصول إلى هذا الرمز المميّز من خلال تمديد FirebaseMessagingService وإلغاء onNewToken().

  1. افتح AndroidManifest.xml وألغِ تعليق الرمز التالي لتفعيل MyFirebaseMessagingService لتطبيق موقّت البيض. تسجّل البيانات الوصفية للخدمة في ملف بيان Android Android MyFirebaseMessagingService كخدمة وتضيف فلتر أهداف حتى تتلقى هذه الخدمة الرسائل المرسَلة من FCM. يعلن الجزء الأخير من البيانات الوصفية عن breakfast_notification_channel_id باعتباره default_notification_channel_id لبرنامج Firebase. ستستخدم رقم التعريف هذا في الخطوة التالية.
<!-- AndroidManifest.xml -->
<!-- TODO: Step 3.0 uncomment to start the service  -->

        <service
                android:name=".MyFirebaseMessagingService"
                android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <!-- [START fcm_default_icon] -->
        <!--
 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/common_google_signin_btn_icon_dark"/>
        <!--
 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"/> <!-- [END fcm_default_icon] -->
        <!-- [START fcm_default_channel] -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/breakfast_notification_channel_id" />
        <!-- [END fcm_default_channel] -->

من المفيد إنشاء قناة إشعارات جديدة لمركز المراسلة عبر السحابة الإلكترونية من Firebase نظرًا لرغبة المستخدمين في تفعيل/إيقاف موقّت البيض أو الإشعارات الفورية الخاصة بالمراسلة عبر السحابة الإلكترونية من Firebase بشكل منفصل.

  1. افتح ui/EggTimerFragment.kt . في onCreateView()، أضِف رمز إنشاء القناة التالي.
// EggTimerFragment.kt

   // TODO: Step 3.1 create a new channel for FCM
    createChannel(
        getString(R.string.breakfast_notification_channel_id),
        getString(R.string.breakfast_notification_channel_name)
    )
  1. افتح MyFirebaseMessagingService.kt وألغِ التعليق على الدالة onNewToken(). وسيتم استدعاء هذه الدالة عند إنشاء رمز مميز جديد.
// MyFirebaseMessagingService.kt

   // TODO: Step 3.2 log registration token
    // [START on_new_token]
    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the     
     * InstanceID token is initially generated so this is where you would retrieve     
     * the token.
     */
    override fun onNewToken(token: String?) {
        Log.d(TAG, "Refreshed token: $token")

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(token)
    }
    // [END on_new_token]
  1. تشغيل تطبيق موقّت البيض
  2. ملاحظة سجلّات (View > Tool Windows > Logcat). من المفترض أن يظهر سطر في السجلّ يعرض الرمز المميّز الذي يشبه الرمز الوارد أدناه. هذا هو الرمز المميز الذي تحتاجه لإرسال رسالة إلى هذا الجهاز. لا يتم استدعاء هذه الدالة إلا عند إنشاء رمز مميز جديد.
2019-07-23 13:09:15.243 2312-2459/com.example.android.eggtimernotifications D/MyFirebaseMsgService: Refreshed token: f2esflBoQbI:APA91bFMzNNFaIskjr6KIV4zKjnPA4hxekmrtbrtba2aDbh593WQnm11ed54Mv6MZ9Yeerver7pzgwfKx7R9BHFffLBItLEgPvrtF0TtX9ToCrXZ5y7Hd-m

ملاحظة: إذا لم يظهر لك الرمز المميّز في رسائل logcat، قد يكون سبق أن استلم تطبيقك الرمز المميّز. وفي هذه الحالة، سيساعدك إلغاء تثبيت التطبيق على تلقي رمز مميز جديد.

يمكنك الآن الاختبار من خلال إرسال إشعار. لإرسال إشعار، يمكنك استخدام منشئ الإشعارات.

  1. افتح وحدة تحكُّم Firebase واختَر مشروعك.
  2. بعد ذلك، اختَر المراسلة عبر السحابة الإلكترونية من شريط التنقل على يمين الصفحة.
  3. انقر على إرسال رسالتك الأولى.

  1. أدخِل Time for Breakfast! كعنوان الإشعار وDon't forget to eat eggs! كنص الإشعار، واختَر إرسال رسالة اختبارية. يظهر مربع الحوار المنبثق اختبار على الجهاز، والذي يطلب منك تقديم رمز مميز لتسجيل FCM.

  1. انسخ رمز تطبيقك المميز من logcat.

  1. الصق هذا الرمز المميز في حقل إضافة رمز مميز لـ FCM ضمن النافذة المنبثقة، ثم انقر على الزر إضافة بجانب الرمز المميز.
  2. في قائمة مربّعات الاختيار التي تظهر، اختَر الرمز المميز. من المفترض أن يصبح الزر اختبار مفعّلاً.

  1. ضع تطبيق Egg Timer على جهازك في الخلفية.
  2. في النافذة المنبثقة، انقر على اختبار.
  1. بعد النقر على اختبار، يجب أن يتلقى جهاز العميل المستهدف الذي يعمل على تطبيقك في الخلفية الإشعار في لوحة إشعارات النظام. (ستشاهد المزيد حول كيفية التعامل مع رسائل المراسلة عبر السحابة الإلكترونية من Firebase عندما يكون تطبيقك في المقدّمة لاحقًا).

المهمة: إرسال إشعارات "المراسلة عبر السحابة الإلكترونية من Firebase" إلى موضوع محدّد

تستند رسائل مواضيع المراسلة عبر السحابة الإلكترونية من Firebase إلى نموذج النشر/الاشتراك.

يمكن أن يكون تطبيق المراسلة مثالاً جيدًا على النموذج نشر/اشتراك. لنفترض أنّ تطبيقًا يتحقّق من الرسائل الجديدة كل 10 ثوانٍ. لن يؤدي ذلك إلى استهلاك طاقة بطارية الهاتف فحسب، بل سيؤدي أيضًا إلى استخدام موارد الشبكة غير الضرورية وإحداث حمل غير ضروري على خادم تطبيقك. بدلاً من ذلك، يمكن لجهاز العميل الاشتراك وتلقّي إشعارات عند تلقّي رسائل جديدة من خلال تطبيقك.

تتيح لك المواضيع إرسال رسالة إلى أجهزة متعدّدة فعّلت هذا الموضوع المحدّد. بالنسبة إلى العملاء، المواضيع هي مصادر بيانات محدّدة يهتم بها العميل. بالنسبة إلى الخادم، المواضيع هي مجموعات من الأجهزة المفعّلة لتلقّي التحديثات على مصدر بيانات معيّن. يمكن استخدام المواضيع لتقديم فئات الإشعارات، مثل الأخبار وتوقعات الطقس ونتائج الرياضة. وفي هذا الجزء من الدرس التطبيقي حول الترميز، ستنشئ موضوعًا لقاء "كسر الإفطار" لتذكير مستخدمي التطبيق المهتمين بتناول البيض مع وجبة الفطور.

للاشتراك في موضوع، يطلب تطبيق العميل وظيفة "المراسلة عبر السحابة الإلكترونية من Firebase" subscribeToTopic() مع اسم الموضوع breakfast. وقد تؤدي هذه المكالمة إلى نتيجتين. إذا نجح المتصل، سيتم الاتصال بمعاودة الاتصال على OnCompleteListener مع إرسال الرسالة التي اشتركت فيها. إذا تعذّر على العميل الاشتراك، ستتلقى معاودة الاتصال رسالة خطأ بدلاً من ذلك.

في تطبيقك، سيتم اشتراك المستخدمين تلقائيًا في موضوع الفطور. ولكن في معظم تطبيقات الإنتاج، من الأفضل منح المستخدمين إمكانية التحكّم في المواضيع التي يمكنهم الاشتراك فيها.

  1. افتح EggTimerFragment.kt وابحث عن دالة subscribeTopic() الفارغة.
  2. احصل على مثال FirebaseMessaging واستدعي الدالة subscibeToTopic() باسم الموضوع.
  3. يمكنك إضافة addOnCompleteListener لتلقّي إشعار من "المراسلة عبر السحابة الإلكترونية من Firebase" حول ما إذا كان اشتراكك قد تعذّر بنجاح أم لا.
// EggTimerFragment.kt

   // TODO: Step 3.3 subscribe to breakfast topic
    private fun subscribeTopic() {
        // [START subscribe_topics]
        FirebaseMessaging.getInstance().subscribeToTopic(TOPIC)
            .addOnCompleteListener { task ->
                var msg = getString(R.string.message_subscribed)
                if (!task.isSuccessful) {
                    msg = getString(R.string.message_subscribe_failed)
                }
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
            }
        // [END subscribe_topics]
    }
  1. وعليك استدعاء وظيفة subscribeTopic() للاشتراك في موضوع عندما يبدأ التطبيق. انتقل للأعلى إلى onCreateView() وأضِف مكالمة إلى subscribeTopic().
// EggTimerFragment.kt

   // TODO: Step 3.4 call subscribe topics on start
    subscribeTopic()

    return binding.root
  1. للاشتراك في موضوع الفطور، شغِّل التطبيق مرة أخرى. من المفترض أن تظهر لك رسالة استفهام تقول "اشترِك في الموضوع "،

يمكنك الآن اختبار إرسال رسائل إلى موضوع:

  1. افتح منشئ الإشعارات واختَر إنشاء إشعار.
  2. عيّن عنوان الإشعار ونص الإشعار كما في السابق.
  3. هذه المرة، بدلاً من إرسال الرسالة إلى جهاز واحد، انقر على الموضوع ضمن الهدف وأدخل breakfast كموضوع الرسالة.

  1. اختَر الآن لتحديد موعد.

  1. تأكّد من تشغيل تطبيقك في الخلفية على جهاز الاختبار.
  1. انقر على مراجعة، ثم انقر على نشر. إذا كان بإمكانك تشغيل التطبيق على أكثر من جهاز واحد، يمكنك اختبار الإشعار وتلقيه على جميع الأجهزة المشتركة في هذا الموضوع.

يتضمن التطبيق القنوات التالية للإشعارات الآن، البيضة والإفطار. على جهاز عميل، انقر مع الاستمرار على رمز التطبيق، واختَر معلومات، وانقر على الإشعارات. من المفترض أن ترى قنوات الإشعارات البيضاء والإفطار، كما هو موضح في لقطة الشاشة التالية. إذا ألغيت اختيار قناة الفطور، لن يتلقّى تطبيقك أي إشعارات تم إرسالها عبر هذه القناة.

عند استخدام الإشعارات، ضع في اعتبارك دائمًا أنه يمكن للمستخدمين إيقاف أي قناة إشعارات في أي وقت.

الخطوة 1: رسائل البيانات

يمكن أن تتضمّن رسائل المراسلة عبر السحابة الإلكترونية من Firebase أيضًا حمولة بيانات تعالج الرسائل في تطبيق العميل، وتستخدم رسائل البيانات بدلاً من رسائل الإشعارات.

للتعامل مع رسائل البيانات، يجب معالجة حمولة البيانات في دالة onMessageReceived() لـ MyFirebaseMessagingService. يتم تخزين الحمولة في خاصية data للعنصر remoteMessage. ويمكن أن يكون كل من الكائن remoteMessage والسمة data null.

  1. فتح MyFirebaseMessagingService.
  2. تحقّق مما إذا كانت الخاصية data للعنصر remoteMessage تحتوي على بعض القيمة وطباعة البيانات إلى السجلّ.
// MyFirebaseMessagingService.kt

    // [START receive_message]
    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
        Log.d(TAG, "From: ${remoteMessage?.from}")
        
       // TODO: Step 3.5 check messages for data
        // Check if the message contains a data payload.
        remoteMessage?.data?.let {
            Log.d(TAG, "Message data payload: " + remoteMessage.data)
        }

    }
    // [END receive_message]

لاختبار الرمز، يمكنك استخدام منشئ الإشعارات مرة أخرى.

  1. افتح أداة إنشاء الإشعارات وأنشئ رسالة جديدة واضبط هدفها على الموضوع "فطرة&الكسر".
  2. في هذه المرة، عند الوصول إلى الخطوة 4، خيارات إضافية، اضبط مفتاح البيانات المخصّصة وخصائص القيمة على النحو التالي:
  1. المفتاح: eggs
  2. القيمة: 3

  1. التأكّد من أنّ تطبيقك يعمل في المقدّمة إذا كان تطبيقك في الخلفية، ستتلقّى رسالة المراسلة عبر السحابة الإلكترونية من Firebase إشعارًا تلقائيًا ولن تتلقّى الدالة onMessageReceived() الكائن remoteMessage إلا عندما ينقر المستخدم على الإشعار.
  2. إرسال الرسالة من أداة إنشاء الإشعارات، وملاحظة سجل رسائل البيانات الذي يظهر في logcat.

الخطوة 2: التعامل مع الرسائل في المقدمة والخلفية

عندما يتلقّى جهاز عميل يشغِّل تطبيقك رسالة تتضمن حمولات بيانات وإشعارات، يعتمد سلوك التطبيق على ما إذا كان التطبيق موجودًا في الخلفية أو في المقدمة على هذا الجهاز:

  • إذا كان التطبيق يعمل في الخلفية، إذا كانت الرسالة تحتوي على حمولة إشعار، يتم عرض الإشعار تلقائيًا في قائمة الإشعارات. وإذا كانت الرسالة تحتوي أيضًا على حمولة بيانات، سيعالج التطبيق حمولة البيانات عندما ينقر المستخدم على الإشعار.
  • إذا كان التطبيق يعمل في المقدّمة، إذا كان إشعار الرسالة يتضمّن حمولة إشعار، لن يظهر الإشعار تلقائيًا. يجب أن يقرّر التطبيق كيفية التعامل مع الإشعار في دالة onMessageReceived(). إذا كانت الرسالة تحتوي أيضًا على حمولة البيانات، سيعالج التطبيق الحمولة.

لأغراض هذا الدرس التطبيقي حول الترميز، عليك تذكير مستخدم التطبيق بتناول بعض البيض في فطوره. لا يتم إرسال أي بيانات، ولكنك تريد أيضًا التأكد من ظهور إشعار التذكير دائمًا، بغض النظر عما إذا كان التطبيق قيد الاستخدام في المقدمة أو في الخلفية.

عند إرسال رسالة عبر ميزة "المراسلة عبر السحابة الإلكترونية من Firebase" إلى أجهزة تم تثبيت تطبيق موقّت البيض عليها، ستظهر رسالة الإشعار تلقائيًا إذا لم يكن التطبيق قيد التشغيل أو كان في الخلفية. ومع ذلك، إذا كان التطبيق يعمل في المقدّمة، لا يتم عرض الإشعار تلقائيًا، ولكن يحدّد رمز التطبيق الإجراء المطلوب اتخاذه بشأن الرسالة. إذا كان التطبيق في المقدّمة عند تلقّي رسالة "المراسلة عبر السحابة الإلكترونية من Firebase"، سيتم تشغيل دالة onMessageReceived() تلقائيًا باستخدام رسالة "المراسلة عبر السحابة الإلكترونية من Firebase". هذا هو المكان الذي يمكن فيه للتطبيق معالجة الإشعارات وحمولات البيانات أو إرسال إشعار بدون تنبيه.

بالنسبة إلى تطبيقك، عليك التأكد من تلقّي المستخدم للتذكير عندما يكون التطبيق في المقدّمة، لذلك لننفّذ بعض الرموز لتفعيل إشعار:

  1. افتح الدالة onMessageReceived() في MyFirebaseMessagingService مرة أخرى.
  2. مباشرةً بعد الرمز الذي أضفته مؤخرًا للتحقّق من رسالة البيانات، أضِف الرمز التالي الذي يرسل إشعارًا باستخدام إطار عمل الإشعارات.
// MyFirebaseMessagingService.kt

    // TODO: Step 3.6 check messages for notification and call sendNotification
    // Check if the message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
        sendNotification(it.body as String)
    }
  1. وفي حال تشغيل التطبيق مرة أخرى وإرسال إشعار باستخدام أداة إنشاء الإشعارات، من المفترض أن يظهر لك إشعار مثلما اعتدت في الجزء الأول من الدرس التطبيقي، بغض النظر عمّا إذا كان التطبيق يعمل في المقدّمة أو في الخلفية.

يمكنك العثور على رمز الحل في الفرع الرئيسي للرمز الذي تم تنزيله.

  • تنفيذ مستقبِل بث FCM من خلال تمديد FirebaseMessagingService.
  • يمكنك إعداد مشروع المراسلة عبر السحابة الإلكترونية من Firebase (FCM) وإضافة المراسلة عبر السحابة الإلكترونية من Firebase إلى تطبيقك المتوافق مع Android.
  • اختبِر تطبيقك من خلال إرسال إشعارات فورية من منشئ الإشعارات.
  • اشترِك في موضوع المراسلة عبر السحابة الإلكترونية من Firebase من خلال استدعاء دالة subscribeToTopic() التابعة لصف FirebaseMessaging.
  • إرسال حمولة البيانات باستخدام عنصر RemoteMessage.
  • معالجة البيانات في الدالة onMessageReceived().
  • يمكنك إضافة منطق للتعامل مع ميزة "المراسلة عبر السحابة الإلكترونية من Firebase" عندما يكون التطبيق في المقدّمة ووقت ظهوره في الخلفية.

دورة Udacity:

مستندات Firebase:

وللحصول على روابط إلى دروس تطبيقية أخرى حول الترميز في هذه الدورة التدريبية، اطّلِع على الصفحة المقصودة المتقدّمة لنظام الترميز Android في لغة Kotlin.