Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

رسیدگی به پیام ها

برای دریافت پیام، استفاده از یک سرویس است که گسترش FirebaseMessagingService . خدمات شما باید نادیده گرفتن onMessageReceived و onDeletedMessages تماس مجدد. باید هر پیامی را ظرف 20 ثانیه پس از دریافت دریافت کند (10 ثانیه در اندروید مارشمالو). پنجره زمان ممکن است بسته به تاخیر سیستم عامل پیش از فراخوانی متحمل تواند کوتاه تر onMessageReceived . پس از آن زمان، رفتارهای سیستم عامل های مختلف از جمله آندروید O و محدودیت اعدام پس زمینه ممکن است با توانایی خود را برای تکمیل کار خود را دخالت. برای کسب اطلاعات بیشتر در مرور کلی ما را ببینید اولویت پیام .

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

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

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

به طور خلاصه:

وضعیت برنامه اطلاع داده ها هر دو
پیش زمینه onMessageReceived onMessageReceived onMessageReceived
زمینه سینی سیستم onMessageReceived اعلان: سینی سیستم
داده ها: در موارد اضافی قصد.
برای کسب اطلاعات بیشتر در مورد انواع پیام، و اطلاعیه ها و داده های پیام .

مانیفست برنامه را ویرایش کنید

برای استفاده از 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 شی و دریافت داده ها پیام:

جاوا

@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.
}

کاتلین + KTX

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}")

        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.
    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.
}

نادیده گرفتن onDeletedMessages

در برخی شرایط، FCM ممکن است پیامی را ارائه نکند. این زمانی اتفاق می‌افتد که پیام‌های زیادی (بیش از 100) برای برنامه شما در زمان اتصال دستگاه خاص در انتظار آن باشد یا اگر دستگاه بیش از یک ماه است که به FCM متصل نشده باشد. در این موارد، شما ممکن است پاسخ به تماس به دریافت FirebaseMessagingService.onDeletedMessages() هنگامی که به عنوان مثال برنامه این پاسخ به تماس دریافت، آن را باید یک همگام سازی کامل با سرور برنامه خود را انجام دهد. اگر شما یک پیام به برنامه را در آن دستگاه در 4 هفته گذشته فرستاده نشد، FCM خواهد پاسخ نمی onDeletedMessages() .

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

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

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

بینش به تحویل پیام را به برنامه خود را، مشاهده داشبورد FCM گزارش ، که سوابق تعدادی از پیام های ارسال شده و برای "برداشت" (اطلاعیه دیده شده توسط کاربران) برای برنامه های آندروید باز در دستگاه های اپل و اندروید، همراه با داده.

برنامه‌های محدود پس‌زمینه (Android P یا جدیدتر)

FCM ممکن است پیام را به برنامه های که به قرار گرفتند ارائه نمی محدودیت پس زمینه توسط کاربر (مانند از طریق: تنظیمات -> نرم افزار و اطلاع رسانی -> [درباره APPNAME] -> باتری). هنگامی که برنامه شما از محدودیت پس‌زمینه حذف شد، پیام‌های جدید مانند قبل به برنامه تحویل داده می‌شود. به منظور جلوگیری از پیام های از دست داده و دیگر اثرات محدودیت پس زمینه، مطمئن شوید که برای جلوگیری از رفتارهای بد ذکر شده توسط اعضای حیاتی و موثر آندروید تلاش. این رفتارها می‌تواند منجر به این شود که دستگاه Android به کاربر توصیه کند برنامه شما در پس‌زمینه محدود شود. برنامه شما می توانید بررسی کنید اگر پس زمینه محدود با استفاده از است: isBackgroundRestricted () .

پیام های FCM را در حالت راه اندازی مستقیم دریافت کنید

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

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

پیش نیازها

  • دستگاه باید برای حالت بوت مستقیم تنظیم شود.
  • دستگاه باید یک نسخه جدید از خدمات Google Play (19.0.54 یا جدیدتر) نصب کرده باشد.
  • برنامه باید با استفاده از FCM SDK ( com.google.firebase:firebase-messaging ) برای دریافت پیام FCM.

مدیریت پیام حالت بوت مستقیم را در برنامه خود فعال کنید

  1. در فایل Gradle در سطح برنامه، یک وابستگی به کتابخانه پشتیبانی مستقیم بوت FCM اضافه کنید:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. را برنامه FirebaseMessagingService بوت مستقیم آگاه با اضافه کردن android:directBootAware="true" ویژگی را در مانیفست برنامه:

    <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false"
        android:directBootAware="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    

این مهم است که اطمینان حاصل شود که این FirebaseMessagingService می توانید در حالت بوت مستقیم اجرا کنید. الزامات زیر را بررسی کنید:

  • این سرویس نباید در حین اجرای در حالت راه‌اندازی مستقیم، به فضای ذخیره‌سازی محافظت شده اعتبار دسترسی داشته باشد.
  • این سرویس باید به اجزای استفاده، مانند تلاش Activities ، BroadcastReceivers ، و یا دیگر Services که به عنوان بوت مستقیم آگاه مشخص شده است در حالی که در حال اجرا در حالت بوت مستقیم.
  • هیچ کتابخانه‌ای که این سرویس استفاده می‌کند نباید به فضای ذخیره‌سازی حفاظت‌شده اعتبار دسترسی داشته باشد و در حین اجرا در حالت راه‌اندازی مستقیم، مؤلفه‌های غیرdirectBootAware را فراخوانی نکند. این بدان معناست که هر کتابخانه‌ای که برنامه استفاده می‌کند و از سرویس فراخوانی می‌شود، باید از راه‌اندازی مستقیم آگاه باشد یا برنامه باید بررسی کند که آیا در حالت راه‌اندازی مستقیم اجرا می‌شود و آنها را در آن حالت فراخوانی نکند. برای مثال، Firebase SDK با راه‌اندازی مستقیم کار می‌کند (آنها را می‌توان در یک برنامه قرار داد بدون اینکه در حالت راه‌اندازی مستقیم از کار بیفتد)، اما بسیاری از APIهای Firebase از فراخوانی در حالت راه‌اندازی مستقیم پشتیبانی نمی‌کنند.
  • اگر برنامه با استفاده از یک سفارشی Application از Application نیز باید بوت مستقیم آگاه (بدون دسترسی به ذخیره سازی محافظت شده اعتبارنامه در حالت بوت مستقیم).

برای راهنمایی در ارسال پیام به دستگاه های در حالت بوت مستقیم، مشاهده و ارسال پیام های بوت فعال مستقیم .