با استفاده از Firebase Cloud Messaging پیام ها را دریافت کنید

این راهنما نحوه راه‌اندازی Firebase Cloud Messaging در برنامه‌های موبایل و کلاینت وب خود توضیح می‌دهد تا بتوانید پیام‌ها را به‌طور مطمئن دریافت کنید.

برای دریافت پیام‌ها، می‌توانید از سرویسی استفاده کنید که FirebaseMessagingService گسترش می‌دهد. سرویس شما باید تماس‌های onMessageReceived و onDeletedMessages را لغو کند. برای یک مثال کامل، نمونه راه اندازی سریع Firebase Cloud Messaging را ببینید.

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 نماد برنامه را به رنگ سفید نمایش می‌دهد.

لغو روی 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 را همراه با داده‌های «impressions» (اعلان‌های مشاهده شده توسط کاربران) برای برنامه‌های Android ثبت می‌کند.