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

انتخاب پلاتفرم: iOS+ Android وب 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 ثبت می‌کند.