קבל הודעות באפליקציית 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 מציג את סמל ברירת המחדל המותאם אישית עבור

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

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

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

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

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

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

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