קבל הודעות באפליקציית Android

התראות Firebase מתנהגות אחרת בהתאם למצב החזית / הרקע של האפליקציה המקבלת. אם אתה רוצה foregrounded אפליקציות לקבל הודעות התראה או הודעות נתונים, תצטרך קוד לכתוב לטפל onMessageReceived ההתקשרות. לקבלת הסבר על ההבדל בין הודעות הודעה ונתונים, לראות סוגי מסר .

טיפול בהודעות

כדי לקבל הודעות, להשתמש בשירות זה מרחיב FirebaseMessagingService . השירות צריך להחליף את onMessageReceived ו onDeletedMessages הגיע ליעדן. הוא אמור לטפל בכל הודעה תוך 20 שניות מרגע הקבלה (10 שניות באנדרואיד מרשמלו). חלון הזמן עשוי להיות קצר יותר בהתאם עיכובים OS שנגרמו לקראת קורא 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.
}

Kotlin + 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() .

טיפול בהודעות התראה באפליקציה ברקע

כאשר האפליקציה שלך ברקע, אנדרואיד מפנה הודעות התראה למגש המערכת. לחיצה על המשתמש על ההודעה פותחת את משגר היישומים כברירת מחדל.

זה כולל הודעות המכילות גם עומס מטען על נתונים (וכל ההודעות שנשלחות ממסוף ההודעות). במקרים אלה, ההודעה מועברת למגש המערכת של המכשיר, ומטען הנתונים מועבר בתוספת הכוונה לפעילות ההפעלה שלך.

לקבלת תובנה משלוח הודעה באפליקציה, לראות את FCM מרכז השליטה של דיווח , אשר מתעדת את מספר ההודעות שנשלחו ופתח במכשירי iOS ו- Android, יחד עם נתונים עבור "הופעות" (הודעות נתפס על ידי משתמשים) עבור אפליקציות אנדרואיד.

אפליקציות מוגבלות ברקע (Android P ומעלה)

FCM לא יכול להעביר מסרים לאפליקציות אשר הוכנסו הגבלה ברקע על ידי המשתמש (כגון באמצעות: Setting -> אפליקציות והודעות -> [APPNAME] -> סוללה). לאחר הסרת האפליקציה שלך מהגבלת הרקע, הודעות חדשות לאפליקציה יועברו כמו בעבר. על מנת למנוע הודעות אבוד משפיעה הגבלת רקע אחרת, הקפד להימנע התנהגויות רעות המפורטות ידי vitals אנדרואיד המאמץ. התנהגויות אלה עשויות להוביל לכך שמכשיר ה- Android ימליץ למשתמש כי האפליקציה שלך תהיה מוגבלת ברקע. היישום יכול לבדוק אם זה רקע המוגבל באמצעות: isBackgroundRestricted () .

קבל הודעות FCM במצב אתחול ישיר

מפתחים שרוצים לשלוח הודעות FCM לאפליקציות עוד לפני נעילת המכשיר יכולים לאפשר לאפליקציית Android לקבל הודעות כאשר המכשיר נמצא במצב אתחול ישיר. לדוגמה, ייתכן שתרצה שמשתמשים באפליקציה שלך יקבלו התראות על אזעקה גם במכשיר נעול.

כאשר בונים את זה למקרה השימוש, לשמור על כללי שיטות עבודה מומלצות הגבלות על מצב אתחול ישיר . זה חשוב במיוחד כדי לשקול את הנראות של הודעות אתחול מאופשר ישירות; כל משתמש שיש לו גישה למכשיר יכול להציג הודעות אלה מבלי להזין אישורי משתמש.

תנאים מוקדמים

  • יש להגדיר את המכשיר למצב אתחול ישיר.
  • על המכשיר להתקין גרסה עדכנית של שירותי Google Play (19.0.54 ואילך).
  • אפליקציית חייב להיות באמצעות SDK FCM ( 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 בזמן שהם פועלים במצב אתחול ישיר. המשמעות היא שכל הספריות שהאפליקציה משתמשות בהן נקראות מהשירות יצטרכו להיות מודעים לאתחול ישיר, או שהאפליקציה תצטרך לבדוק אם היא פועלת במצב אתחול ישיר ולא לקרוא להן במצב זה. לדוגמה, SDKs של Firebase עובדים עם אתחול ישיר (הם יכולים להיכלל באפליקציה מבלי לקרוס אותה במצב אתחול ישיר), אך ממשקי API רבים של Firebase אינם תומכים בקריאה במצב אתחול ישיר.
  • אם האפליקציה להשתמש מנהג Application , את Application יצטרך גם להיות ישיר אתחול מודע (אין גישה לאחסון מוגן אישורים במצב אתחול ישיר).

לקבלת הדרכה על שליחת הודעות במכשירים במצב אתחול ישיר, לראות שלחו הודעות ישירות מאופשר אתחול .