اندروید پیشرفته در Kotlin 01.2: Android Firebase Cloud Messaging

این کد لبه بخشی از دوره آموزشی Advanced Android in Kotlin است. اگر از طریق کدها به صورت متوالی کار کنید، بیشترین ارزش را از این دوره خواهید گرفت، اما اجباری نیست. همه کدهای دوره در صفحه فرود Android Advanced in Kotlin Codelabs فهرست شده اند.

مقدمه

در آزمایشگاه کد قبلی ، اعلان هایی را به تایمر تخم مرغ خود اضافه کردید که در برنامه شما ایجاد و راه اندازی می شوند. یکی دیگر از موارد مهم استفاده از اعلان‌ها، ارسال اعلان‌های فشار از راه دور است که حتی زمانی که برنامه شما در حال اجرا نیست، قابل دریافت است.

پوش نوتیفیکیشن چیست؟

اعلان‌های فشاری اعلان‌هایی هستند که سرور به دستگاه‌های تلفن همراه «هل» می‌کند. آنها را می توان بدون توجه به اینکه آیا برنامه شما در حال اجرا است یا خیر، به یک دستگاه تحویل داد.

اعلان‌های فشاری راهی عالی برای اطلاع رسانی به کاربران در مورد به‌روزرسانی یا یادآوری یک کار یا ویژگی است. تصور کنید منتظر باشید تا یک محصول دوباره در انبار موجود شود. با یک اعلان فشاری، یک برنامه خرید می‌تواند به‌جای اینکه مجبور باشید هر روز وضعیت موجودی را بررسی کنید، به‌روزرسانی‌های سهام را به شما اطلاع می‌دهد.

اعلان‌های فشاری از الگوی انتشار/اشتراک استفاده می‌کنند، که به برنامه‌های پشتیبان اجازه می‌دهد محتوای مرتبط را به مشتریان علاقه‌مند ارسال کنند. بدون مدل انتشار/اشتراک، کاربران برنامه شما باید به‌طور دوره‌ای به‌روزرسانی‌های برنامه شما را بررسی کنند. این فرآیند برای کاربران خسته کننده و غیر قابل اعتماد است. علاوه بر این، با افزایش تعداد مشتری‌ها، این بررسی‌های دوره‌ای بار زیادی را روی منابع شبکه و پردازش، هم برای سرور برنامه شما و هم برای دستگاه کاربر، وارد می‌کند.

درست مانند سایر انواع اعلان ها، مطمئن شوید که با پوش نوتیفیکیشن به کاربران خود احترام می گذارید. اگر محتوای اعلان برای کاربر جالب یا به موقع نباشد، می تواند به راحتی تمام اعلان ها را از برنامه شما خاموش کند.

Firebase Cloud Messaging چیست؟

Firebase Cloud Messaging بخشی از پلتفرم Firebase برای توسعه موبایل است. معمولاً باید سروری را از ابتدا راه‌اندازی کنید که بتواند با دستگاه‌های تلفن همراه برای راه‌اندازی اعلان‌ها ارتباط برقرار کند. با Firebase Cloud Messaging، می‌توانید بدون راه‌اندازی سرور، اعلان‌ها را برای همه کاربران برنامه نصب‌شده یا زیرمجموعه‌ای از آنها ارسال کنید. به عنوان مثال، می‌توانید به کاربران یک یادآوری ارسال کنید یا به آن‌ها یک تبلیغ ویژه، مانند یک هدیه رایگان بدهید. می‌توانید از راه دور یک اعلان را به یک دستگاه یا چند دستگاه فشار دهید.

همچنین می‌توانید از Firebase Cloud Messages برای انتقال داده‌ها از برنامه Backend خود یا از پروژه Firebase به کاربران خود استفاده کنید.

در این کد لبه یاد خواهید گرفت که چگونه از Firebase Cloud Messaging برای ارسال اعلان‌های فشار برای برنامه اندروید خود و همچنین ارسال داده استفاده کنید.

اگر در حین کار با این کد با مشکلاتی (اشکالات کد، خطاهای دستوری، عبارت نامشخص و غیره) مواجه شدید، لطفاً مشکل را از طریق پیوند گزارش یک اشتباه در گوشه سمت چپ پایین صفحه کد گزارش کنید.

آنچه از قبل باید بدانید

باید با:

  • نحوه ایجاد برنامه های اندروید در Kotlin. به ویژه، با Android SDK کار کنید.
  • چگونه اپلیکیشن خود را با استفاده از اجزای معماری و اتصال داده طراحی کنیم.
  • درک اولیه از گیرنده های پخش.
  • درک اولیه از AlarmManager.
  • نحوه ایجاد و ارسال اعلان با استفاده از NotificationManager.

چیزی که یاد خواهید گرفت

  • چگونه پیام ها را از طریق Firebase Cloud Messaging به کاربر ارسال کنیم.
  • چگونه با استفاده از پیام‌های داده، که بخشی از Firebase Cloud Messaging است، داده‌ها را از پشتیبان به برنامه خود ارسال کنید.

کاری که خواهی کرد

  • اعلان‌های فشاری را به برنامه شروع اضافه کنید.
  • هنگامی که برنامه شما در حال اجرا است، از Firebase Cloud Messaging مدیریت کنید.
  • انتقال داده با Firebase Cloud Messaging.

در این کد لبه شما روی کدهای قبلی با استفاده از اعلان‌ها در کد لبه برنامه‌های Android کار می‌کنید . در آزمایشگاه کد قبلی، یک برنامه تایمر تخم مرغ ساخته اید که وقتی تایمر پخت و پز تمام می شود، اعلان ها را ارسال می کند. در این کد لبه، شما Firebase Cloud Messaging را اضافه می‌کنید تا اعلان‌های فشاری را برای کاربران برنامه خود ارسال کنید تا به آنها یادآوری کنید که تخم مرغ بخورند.

برای دریافت نمونه برنامه، می توانید یکی از موارد زیر را انجام دهید:

مخزن را از GitHub کلون کنید و به شاخه شروع کننده سوئیچ کنید:

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


یا می توانید مخزن را به صورت یک فایل Zip دانلود کنید، آن را از حالت فشرده خارج کنید و در اندروید استودیو باز کنید.

زیپ را دانلود کنید

مرحله 1: یک پروژه Firebase ایجاد کنید

قبل از اینکه بتوانید Firebase را به برنامه Android خود اضافه کنید، باید یک پروژه Firebase برای اتصال به برنامه Android خود ایجاد کنید.

  1. وارد کنسول Firebase شوید.
  2. روی افزودن پروژه کلیک کنید، سپس نام پروژه را انتخاب یا وارد کنید. نام پروژه خود را fcm-codelab بگذارید .
  3. روی Continue کلیک کنید.
  4. می‌توانید با خاموش کردن دکمه فعال کردن Google Analytics برای این پروژه ، از تنظیم Google Analytics صرف‌نظر کنید.
  5. برای پایان راه‌اندازی پروژه Firebase، روی Create Project کلیک کنید.

مرحله 2: برنامه خود را در Firebase ثبت کنید

اکنون که یک پروژه Firebase دارید، می توانید برنامه اندروید خود را به آن اضافه کنید.

  1. در مرکز صفحه نمای کلی پروژه کنسول Firebase ، روی نماد Android کلیک کنید تا گردش کار راه اندازی راه اندازی شود.

  1. در قسمت نام بسته Android ، com.example.android.eggtimernotifications را وارد کنید.
  2. روی ثبت برنامه کلیک کنید.

مهم: مطمئن شوید که شناسه صحیح برنامه خود را وارد کرده اید زیرا نمی توانید پس از ثبت برنامه خود در پروژه Firebase، این مقدار را اضافه یا تغییر دهید.

مرحله 3: فایل پیکربندی Firebase را به پروژه خود اضافه کنید

فایل پیکربندی اندروید Firebase را به برنامه خود اضافه کنید.

  1. برای دریافت فایل پیکربندی Android Firebase ( google-services.json ) روی Download google-services.json کلیک کنید. مطمئن شوید که فایل پیکربندی با کاراکترهای اضافی اضافه نشده است و دقیقاً google-services.json نام دارد.
  2. فایل پیکربندی خود را به پوشه ماژول (سطح برنامه) برنامه خود منتقل کنید.

مرحله 4: پروژه اندروید خود را برای فعال کردن محصولات Firebase پیکربندی کنید

برای فعال کردن محصولات Firebase در برنامه خود، باید افزونه google-services را به فایل های Gradle خود اضافه کنید.

  1. در فایل Gradle در سطح ریشه (سطح پروژه) خود ( build.gradle )، بررسی کنید که مخزن Maven Google را دارید.
  2. سپس، قوانینی را اضافه کنید تا افزونه Google Services را نیز شامل شود.

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 داده شده است. در مراحل زیر کدی را به برنامه اندروید خود اضافه خواهید کرد.

برای آزمایش پیاده سازی خود از Notifications composer استفاده خواهید کرد. Notifications composer ابزاری است که به شما در نوشتن و ارسال پیام از وب سایت کنسول Firebase کمک می کند.

  1. MyFirebaseMessagingService.kt باز کنید
  2. فایل و به ویژه توابع زیر را بررسی کنید:
  • onNewToken() اگر سرویس شما در مانیفست اندروید ثبت شده باشد به صورت خودکار فراخوانی می شود. این تابع زمانی که برای اولین بار برنامه خود را اجرا می کنید و هر بار که Firebase یک توکن جدید برای برنامه شما صادر می کند، فراخوانی می شود. توکن یک کلید دسترسی به پروژه باطن Firebase شما است. برای دستگاه مشتری خاص شما ایجاد شده است. با استفاده از این توکن، Firebase می داند که پشتیبان باید به کدام کلاینت پیام بفرستد. Firebase همچنین می داند که آیا این کلاینت معتبر است و به این پروژه Firebase دسترسی دارد یا خیر.
  • onMessageReceived - زمانی که برنامه شما در حال اجرا است و Firebase پیامی به برنامه شما ارسال می کند، تماس گرفته می شود. این تابع یک شی RemoteMessage را دریافت می کند که می تواند یک اعلان یا پیام داده را حمل کند. بعداً در این Codelab درباره تفاوت‌های بین اعلان‌ها و بارهای پیام داده اطلاعات بیشتری خواهید آموخت.

مرحله 1: ارسال اعلان‌های FCM به یک دستگاه

کنسول Notifications به شما امکان می دهد ارسال اعلان را آزمایش کنید. برای ارسال پیام به یک دستگاه خاص با استفاده از کنسول، باید رمز ثبت نام آن دستگاه را بدانید.

هنگامی که باطن Firebase یک توکن جدید یا تازه‌سازی شده تولید می‌کند، تابع onNewToken() فراخوانی می‌شود و توکن جدید به عنوان آرگومان ارسال می‌شود. اگر می‌خواهید یک دستگاه را هدف قرار دهید یا گروهی از دستگاه‌ها را ایجاد کنید که می‌خواهید پیام پخشی به آن ارسال کنید، باید با گسترش FirebaseMessagingService و لغو onNewToken() به این نشانه دسترسی داشته باشید.

  1. AndroidManifest.xml را باز کنید و کد زیر را حذف کنید تا MyFirebaseMessagingService برای برنامه تایمر تخم مرغ فعال شود. فراداده سرویس در مانیفست اندروید 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] -->

ایده خوبی است که یک کانال اعلان جدید برای FCM ایجاد کنید زیرا کاربران شما ممکن است بخواهند تایمر تخم مرغ یا اعلان های فشار FCM را به طور جداگانه فعال/غیرفعال کنند.

  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. logcat را مشاهده کنید ( 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 نمی‌بینید، ممکن است برنامه شما قبلاً توکن را دریافت کرده باشد. در این صورت، حذف برنامه به شما کمک می کند تا یک توکن جدید دریافت کنید.

اکنون می توانید با ارسال اعلان تست کنید. برای ارسال اعلان، از آهنگساز Notifications استفاده می کنید.

  1. کنسول Firebase را باز کنید و پروژه خود را انتخاب کنید.
  2. سپس، Cloud Messaging را از پیمایش سمت چپ انتخاب کنید.
  3. روی ارسال اولین پیام خود کلیک کنید.

  1. Time for Breakfast! به عنوان عنوان اعلان و Don't forget to eat eggs! به عنوان متن اعلان، و ارسال پیام آزمایشی را انتخاب کنید. کادر گفتگوی پاپ آپ Test on device ظاهر می شود و از شما می خواهد که یک رمز ثبت FCM ارائه دهید.

  1. کد برنامه خود را از logcat کپی کنید.

  1. این توکن را در قسمت Add an register register FCM در پنجره بازشو قرار دهید، سپس روی دکمه Add در کنار نشانه کلیک کنید.
  2. در لیست چک باکسی که ظاهر می شود، نشانه را انتخاب کنید. دکمه تست باید فعال شود.

  1. در دستگاه خود، برنامه Egg Timer را در پس زمینه قرار دهید.
  2. در پنجره بازشو، روی Test کلیک کنید.
  1. بعد از اینکه روی تست کلیک کردید، دستگاه مشتری مورد نظر که برنامه شما را در پس‌زمینه اجرا می‌کند باید اعلان را در سینی اعلان‌های سیستم دریافت کند. (شما بعداً در مورد نحوه مدیریت پیام های FCM هنگامی که برنامه شما در پیش زمینه است، خواهید دید.)

وظیفه: ارسال اعلان‌های FCM به یک موضوع

پیام‌رسانی موضوع FCM بر اساس مدل انتشار/اشتراک است.

یک برنامه پیام رسانی می تواند نمونه خوبی برای مدل Publish/Subscribe باشد. تصور کنید که یک برنامه هر 10 ثانیه پیام های جدید را بررسی می کند. این نه تنها باتری گوشی شما را خالی می کند، بلکه از منابع شبکه غیرضروری نیز استفاده می کند و بار غیرضروری روی سرور برنامه شما ایجاد می کند. درعوض، یک دستگاه مشتری می‌تواند مشترک شود و هنگامی که پیام‌های جدیدی از طریق برنامه شما ارسال می‌شود، مطلع می‌شود.

موضوعات به شما امکان می دهد پیامی را به چندین دستگاهی که در آن موضوع خاص شرکت کرده اند ارسال کنید. برای کلاینت‌ها، موضوعات منابع داده خاصی هستند که مشتری به آنها علاقه دارد. برای سرور، موضوعات گروه‌هایی از دستگاه‌هایی هستند که برای دریافت به‌روزرسانی‌ها در یک منبع داده خاص انتخاب شده‌اند. از موضوعات می توان برای ارائه دسته بندی اعلان ها مانند اخبار، پیش بینی آب و هوا و نتایج ورزشی استفاده کرد. برای این قسمت از نرم افزار کد، یک موضوع "صبحانه" ایجاد می کنید تا به کاربران علاقه مند برنامه یادآوری کنید که همراه با صبحانه خود تخم مرغ بخورند.

برای اشتراک در یک موضوع، برنامه مشتری تابع Firebase Cloud Messaging subscribeToTopic( ) را با نام موضوع breakfast فراخوانی می‌کند. این تماس می تواند دو نتیجه داشته باشد. اگر تماس گیرنده موفق شود، پاسخ تماس OnCompleteListener با پیام مشترک تماس گرفته می شود. اگر مشتری نتواند مشترک شود، پاسخ تماس به جای آن یک پیام خطا دریافت می کند.

در برنامه خود، به طور خودکار کاربران خود را در موضوع صبحانه مشترک می کنید. با این حال، در اکثر برنامه‌های تولیدی، بهتر است به کاربران اجازه داده شود که در کدام موضوعات مشترک شوند.

  1. EggTimerFragment.kt را باز کنید و تابع subscribeTopic() خالی را پیدا کنید.
  2. یک نمونه از FirebaseMessaging دریافت کنید و تابع subscibeToTopic() را با نام موضوع فراخوانی کنید.
  3. یک addOnCompleteListener اضافه کنید تا از FCM در مورد موفقیت یا عدم موفقیت اشتراک خود مطلع شوید.
// 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. آهنگساز Notifications را باز کنید و Compose Notification را انتخاب کنید.
  2. عنوان اعلان و متن اعلان را مانند قبل تنظیم کنید.
  3. این بار به جای ارسال پیام به یک دستگاه، روی موضوع زیر هدف کلیک کنید و breakfast را به عنوان موضوع پیام وارد کنید.

  1. اکنون برای زمانبندی انتخاب کنید.

  1. مطمئن شوید که برنامه شما در پس‌زمینه دستگاه آزمایشی شما اجرا می‌شود.
  1. روی Review کلیک کنید و سپس روی انتشار کلیک کنید. اگر می‌توانید برنامه را روی بیش از یک دستگاه اجرا کنید، می‌توانید آزمایش کنید و مشاهده کنید که اعلان در همه دستگاه‌های مشترک این موضوع دریافت می‌شود.

این برنامه اکنون کانال های زیر را برای اعلان ها دارد، تخم مرغ و صبحانه . در دستگاه مشتری، روی نماد برنامه طولانی کلیک کنید، Info را انتخاب کنید و روی Notifications کلیک کنید. همانطور که در تصویر زیر نشان داده شده است، باید کانال های اعلان تخم مرغ و صبحانه را ببینید. اگر کانال صبحانه را لغو انتخاب کنید، برنامه شما هیچ اعلان ارسالی از طریق این کانال را دریافت نخواهد کرد.

هنگام استفاده از اعلان ها، همیشه به خاطر داشته باشید که کاربران می توانند هر کانال اطلاع رسانی را در هر زمانی خاموش کنند.

مرحله 1: پیام های داده

پیام‌های FCM همچنین می‌توانند حاوی یک محموله داده باشند که پیام‌ها را در برنامه مشتری پردازش می‌کند، از پیام‌های داده به جای پیام‌های اعلان استفاده می‌کند.

برای مدیریت پیام‌های داده، باید بار داده را در تابع 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]

برای تست کد خود، می توانید دوباره از Notifications composer استفاده کنید.

  1. آهنگساز اعلان را باز کنید، یک پیام جدید ایجاد کنید و هدف آن را روی موضوع "صبحانه" تنظیم کنید.
  2. این بار، وقتی به مرحله 4، گزینه های اضافی رسیدید ، کلید داده سفارشی و ویژگی های مقدار را به صورت زیر تنظیم کنید:
  1. کلید: eggs
  2. ارزش: 3

  1. مطمئن شوید که برنامه شما در پیش زمینه اجرا می شود. اگر برنامه شما در پس‌زمینه باشد، پیام FCM یک اعلان خودکار را راه‌اندازی می‌کند و زمانی که کاربر روی اعلان کلیک می‌کند، تابع onMessageReceived() تنها شی remoteMessage را دریافت می‌کند.
  2. پیام را از سازنده Notifications ارسال کنید و گزارش پیام داده را که در logcat ظاهر می شود مشاهده کنید.

مرحله 2: مدیریت پیام ها در پیش زمینه و پس زمینه

وقتی یک دستگاه مشتری که برنامه شما را اجرا می‌کند، پیامی دریافت می‌کند که شامل اعلان‌ها و بارهای داده است، رفتار برنامه به این بستگی دارد که برنامه شما در پس‌زمینه یا پیش‌زمینه آن دستگاه باشد:

  • اگر برنامه پس‌زمینه را اجرا می‌کند، اگر پیام دارای بار اعلان باشد، اعلان به طور خودکار در سینی اعلان نشان داده می‌شود. اگر پیام دارای محموله داده نیز باشد، زمانی که کاربر روی اعلان ضربه می‌زند، بار داده توسط برنامه مدیریت می‌شود.
  • اگر برنامه در پیش زمینه اجرا می شود، اگر اعلان پیام دارای بار اعلان باشد، اعلان به طور خودکار ظاهر نمی شود. برنامه باید تصمیم بگیرد که چگونه اعلان را در تابع onMessageReceived() کند. اگر پیام دارای محموله داده نیز باشد، هر دو محموله توسط برنامه مدیریت خواهد شد.

برای این کد لبه، شما می خواهید به کاربر برنامه یادآوری کنید که برای صبحانه مقداری تخم مرغ بخورد. شما قصد ارسال هیچ داده ای را ندارید، اما همچنین می خواهید مطمئن شوید که اعلان یادآور همیشه ظاهر می شود، صرف نظر از اینکه برنامه در پیش زمینه یا پس زمینه باشد.

هنگامی که یک پیام FCM را به دستگاه‌هایی که برنامه تایمر تخم مرغ روی آنها نصب شده است ارسال می‌کنید، اگر برنامه اجرا نشود یا در پس‌زمینه باشد، پیام اعلان به‌طور خودکار نشان داده می‌شود. با این حال، اگر برنامه در پیش زمینه اجرا شود، اعلان به طور خودکار نشان داده نمی شود. در عوض، کد برنامه تصمیم می گیرد که با پیام چه کاری انجام دهد. اگر برنامه هنگام دریافت پیام FCM در پیش زمینه باشد، تابع onMessageReceived() به طور خودکار با پیام FCM فعال می شود. اینجاست که برنامه شما می‌تواند بی‌صدا اعلان‌ها و بارهای داده را مدیریت کند یا یک اعلان را راه‌اندازی کند.

برای برنامه خود، می‌خواهید مطمئن شوید که کاربر وقتی برنامه در پیش‌زمینه است، یادآوری را دریافت می‌کند، بنابراین بیایید کدی را برای راه‌اندازی یک اعلان پیاده‌سازی کنیم:

  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. اگر دوباره برنامه را اجرا کنید و با استفاده از Notifications composer اعلان ارسال کنید، بدون توجه به اینکه برنامه در پیش‌زمینه یا پس‌زمینه باشد، باید اعلانی را دقیقاً مانند آنچه در قسمت اول Codelab مشاهده می‌کردید، مشاهده کنید.

کد راه حل در شاخه اصلی کد دانلود شده شما قرار دارد.

  • با گسترش FirebaseMessagingService یک FCM BroadcastReceiver را پیاده سازی کنید.
  • یک پروژه Firebase Cloud Messaging (FCM) راه اندازی کنید و FCM را به برنامه اندروید خود اضافه کنید.
  • برنامه خود را با ارسال اعلان‌های فشاری از سازنده Notifications تست کنید.
  • با فراخوانی تابع subscribeToTopic() از کلاس FirebaseMessaging در موضوعات FCM مشترک شوید.
  • ارسال یک محموله داده با استفاده از یک شی RemoteMessage .
  • داده ها را در onMessageReceived() کنید.
  • زمانی که برنامه در پیش‌زمینه و زمانی که در پس‌زمینه است، منطق را برای مدیریت FCM اضافه کنید.

دوره بی ادبی:

مستندات Firebase:

برای پیوند به سایر کدهای این دوره، به صفحه فرود Android Advanced in Kotlin codelabs مراجعه کنید.