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

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

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

כדי לקבל הודעות, השתמש בשירות שמרחיב את FirebaseMessagingService . השירות שלך צריך לעקוף את ההתקשרות חוזרת של onMessageReceived ו- onDeletedMessages .

חלון הזמן לטיפול בהודעה עשוי להיות קצר מ-20 שניות, בהתאם לעיכובים שנגרמו לפני הקריאה onMessageReceived , כולל עיכובים של מערכת ההפעלה, זמן הפעלת האפליקציה, שהשרשור הראשי נחסם על ידי פעולות אחרות, או שיחות onMessageReceived קודמות שנמשכות זמן רב מדי. לאחר זמן זה, התנהגויות שונות של מערכת ההפעלה, כגון הרג תהליך של אנדרואיד או מגבלות ביצוע ברקע של Android 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" />

אנדרואיד מציג את סמל ברירת המחדל המותאם אישית עבור

  • כל הודעות ההתראות שנשלחו ממחבר ההתראות .
  • כל הודעת הודעה שאינה מגדירה במפורש את הסמל במטען ההודעות.

אנדרואיד משתמשת בצבע ברירת המחדל המותאם אישית עבור

  • כל הודעות ההתראות שנשלחו ממחבר ההתראות .
  • כל הודעת הודעה שאינה מגדירה במפורש את הצבע במטען ההודעות.

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

עוקף על onMessageReceived

על ידי ביטול השיטה FirebaseMessagingService.onMessageReceived , תוכל לבצע פעולות על סמך אובייקט RemoteMessage שהתקבל ולקבל את נתוני ההודעה:

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

        // 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() .

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

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

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

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

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

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

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

דרישות מוקדמות

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

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