دریافت پیام در برنامه‌های Android

انتخاب پلاتفرم: iOS+ Android Web Flutter Unity C++‎


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

‫onMessageReceived برای اکثر انواع پیام ارائه می‌شود، با استثنائات زیر:

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

  • پیام‌های دارای هم اعلان و هم داده‌بار، وقتی در پس‌زمینه دریافت می‌شوند. در این مورد، اعلان به سینی سیستم دستگاه تحویل داده می‌شود و داده‌های پیام در موارد اضافی هدف «فعالیت» راه‌انداز شما تحویل داده می‌شود.

به‌طور خلاصه:

وضعیت برنامه اعلان Data هردو
پیش‌زمینه 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 ممکن است پیام را تحویل ندهد. این اتفاق زمانی می‌افتد که پیام‌های معلقه برای برنامه شما در دستگاهی خاص در زمان اتصال آن بسیار زیاد باشد (>۱۰۰) یا اگر دستگاه بیش‌از یک ماه به FCM متصل نشده باشد. در این موارد، ممکن است با FirebaseMessagingService.onDeletedMessages() تماس گرفته شود. وقتی نمونه برنامه این بازخوان را دریافت می‌کند، باید با سرور برنامه شما همگام‌سازی کامل انجام دهد. اگر ظرف ۴ هفته گذشته پیامی به برنامه در آن دستگاه ارسال نکرده باشید، ‫FCM با onDeletedMessages() تماس نخواهد گرفت.

مدیریت پیام‌های اعلان در برنامه پس‌زمینه‌ای

وقتی برنامه شما در پس‌زمینه است، Android پیام‌های اعلان را به سینی سیستم هدایت می‌کند. اگر کاربری روی اعلان ضربه بزند، به‌طور پیش‌فرض راه‌انداز برنامه باز می‌شود.

این شامل پیام‌هایی است که هم اعلان و هم داده‌بار دارند (و همه پیام‌های ارسال‌شده از آهنگ‌ساز اعلان‌ها در کنسول Firebase). در این موارد، اعلان به سینی سیستم دستگاه تحویل داده می‌شود و داده‌های بار در موارد اضافی هدف «فعالیت» راه‌انداز شما تحویل داده می‌شود.

برای دریافت اطلاعات آماری درباره ارسال پیام به برنامه‌تان، به DevOps و تعامل > پیام‌رسانی > داشبورد گزارش‌ها در کنسول Firebase بروید. این داشبورد تعداد پیام‌های ارسال‌شده و بازشده در دستگاه‌های Apple و Android را به‌همراه داده‌های «ظهورها» (اعلان‌هایی که کاربران دیده‌اند) برای برنامه‌های Android ثبت می‌کند.