הגדרה וניהול של רמת העדיפות של הודעות ב-Android

יש שתי אפשרויות להקצאת עדיפות מסירה להודעות שמועברות בהמשך השרשרת ב-Android: עדיפות רגילה ועדיפות גבוהה. כך מתבצעת השליחה של הודעות רגילות והודעות עם עדיפות גבוהה:

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

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

ההבדל בין הודעות עם עדיפות גבוהה לבין הודעות עם עדיפות רגילה

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

עיבוד הודעות עם עדיפות גבוהה ועדיפות רגילה

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

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

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

  • להתראות בעדיפות גבוהה: כדי לוודא שההתראה בעדיפות גבוהה מקבלת זמן עיבוד מתועדף, אפשר להתחיל עבודה מזורזת באמצעות WorkManager ב-Android. כך תוכלו לוודא שההתראה תוצג עד הסוף. החדשות הטובות הן שאם אתם חוששים שתחרגו ממכסות העבודה המואצת כתוצאה מעיבוד ב-FCM בעדיפות גבוהה, אתם לא צריכים לדאוג. יש פטור קצר למשרות שנקבעו לביצוע מיידי אחרי שליחה של הודעת FCM onMessageReceived בעדיפות גבוהה.
  • להתראות בעדיפות רגילה: צריך להתחיל שיחה רגילה WorkRequest באמצעות WorkManager ב-Android. כך תוכלו לוודא שהעבודה הנוספת שנדרשת לעיבוד ההתראה תעובד בסופו של דבר, בלי להשתמש בעיבוד לפי עדיפות ולגרום לבעיות מיותרות בשימוש בסוללה.

הגדרת עדיפות להודעות

אפשר לשלוח התראות למשתמשים באמצעות Admin SDK,‏ FCM REST API ומסוף Firebase. כדי לשנות את הגדרת העדיפות מ-Admin SDK ומ-FCM REST API, צריך לעדכן את מטען ה-JSON של ההודעה. בדוגמת הקוד הבאה אפשר לראות איך מגדירים את העדיפות כגבוהה. אין תמיכה בהגדרת שדות התראה ספציפיים ל-Android עבור התראות שנשלחות מהמסוף.

 {
  "message": {
      "notification": {
          "body": "Purchase exceeding $500 detected",
          "title": "Credit card purchase"
      },
      "data": {
          "purchaser": "Your child",
          "items": "Gravity Defier Sneakers"
      },
      "android": {
          "priority": "high"
      },
      "apns": {
          "headers": {
              "apns-priority": "5"
          }
      }
  }
}

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

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

  1. מגדירים את המכשיר למצב שינה באמצעות ההוראות שבמאמר בדיקת האפליקציה במצב שינה.
  2. ניגשים לטוקן הרישום של FCM מהאפליקציה במכשיר הבדיקה. מידע נוסף על גישה לאסימון זמין במאמר בנושא שליחת הודעת בדיקה לאפליקציה ברקע.
  3. אחרי שמקבלים את FCM הטוקן, שולחים את ההתראה בעדיפות גבוהה למכשיר הבדיקה באמצעות FCM קוד שליחת ההתראות או פקודת cURL עם פרמטרים של הגדרה שתואמים להתראה בעדיפות גבוהה.

הורדת העדיפות של התראות עם עדיפות גבוהה FCM ב-Android

הודעות בעדיפות גבוהה ב-Android מיועדות לתוכן שרלוונטי לזמן מסוים וגלוי למשתמשים, והן אמורות להוביל להצגת התראות למשתמשים. אם FCMמזהה דפוס שבו הודעות לא מובילות להצגת התראות למשתמש, יכול להיות שההודעות שלכם יקבלו עדיפות נמוכה יותר או יועברו לטיפול על ידי שירותי Google Play.

FCM משתמש בנתוני התנהגות של הודעות מ-7 ימים כדי לקבוע אם להוריד את סדר העדיפות של ההודעות או להשתמש בשרת proxy עבורן. המערכת מבצעת את הקביעה הזו באופן עצמאי לכל מופע של האפליקציה. אם ההתראות על הודעות עם עדיפות גבוהה מוצגות למשתמש, זה לא ישפיע על הודעות עתידיות עם עדיפות גבוהה.

העברת הרשאה לשליחת התראות באמצעות Google Play Services

הודעות התראה עם עדיפות גבוהה שעומדות בקריטריונים מסוימים מועברות דרך שרת proxy של שירותי Google Play במקום להוריד את העדיפות שלהן. המשמעות היא ש-Google Play Services מציג את ההתראות בשם האפליקציה, בלי שצריך להפעיל את האפליקציה. הפעולה הזו מתבצעת כדי לשפר את חוויית המשתמש הכוללת במכשירי Android.

חשוב לשים לב שהודעות התראה שעוברות דרך שרת proxy משנות את אופן הדיווח על נתוחי השימוש שקשורים להודעות שמתקבלות:

  • כדי שהניתוח של הודעות שעוברות דרך שרת proxy ידווח, האפליקציה שלכם צריכה להשתמש ב-FCM SDK גרסה 24.0.0 ואילך.
  • יכול להיות שתבחינו בעיכובים או בירידה במספר ההודעות שהתקבלו לעומת המספר לפני ההשקה של הודעות פרוקסי. הסיבה לכך היא שנתוני הניתוח של התראות שמועברות דרך שרת proxy מדווחים רק אחרי שהאפליקציה מתחילה לפעול, ויכול להיות שהם לא ידווחו בכלל אם ההתראה לא תוביל לפתיחת האפליקציה.

העברת הודעות התראה דרך שרת proxy באופן הזה היא התנהגות ברירת המחדל של אפליקציות שמשתמשות ב-Android מגרסה Q ואילך וב-Google Play Services מגרסה 19054000 ואילך. הודעות שנשלחות דרך HTTP v1 API מועברות דרך שרת proxy, אבל הודעות שנשלחות דרך Firebase console או דרך ממשקי API מדור קודם לא מועברות דרך שרת proxy. הערה: התכונה הזו נמצאת כרגע בגרסת בטא, והיא עשויה להשתנות.

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

  • ברמת האפליקציה: מוסיפים את ההנחיה <meta-data android:name= "delivery_metrics_exported_to_big_query_enabled" android:value="false"/> למניפסט של האפליקציה.
  • על בסיס מופע של אפליקציה: מגדירים את fun setNotificationDelegationEnabled(disable: Boolean): Task<Void!> במסלול המשתמש של האפליקציה בממשק המשתמש, בהתאם לתרחיש השימוש הספציפי.
  • לכל הודעה בנפרד: מגדירים את המפתח proxy ל-DENY באובייקט AndroidNotification של בקשת השליחה.

מדידת הורדת העדיפות של הודעות ב-Android

  • הודעות נפרדות. אחרי המסירה, אפשר להשוות בין העדיפות של ההודעה שמוחזרת מ-getPriority() לבין העדיפות המקורית שלה שמוחזרת מ-getOriginalPriority() כדי לדעת אם העדיפות של ההודעה הספציפית הזו הורדה או לא.

  • כל ההודעות. FCM Aggregate Delivery Data API יכול לדווח על האחוז מכל ההודעות שלכם לאנדרואיד שמועברות בסדר עדיפות נמוך יותר. יכול להיות שחלק מההודעות לא ייכללו בדוחות של נתוני הצבירה, אבל בסך הכול הם אמורים לספק תמונה כללית של שיעורי ההורדה של העדיפות של ההודעות. מידע נוסף וקוד לדוגמה לשליחת שאילתות ל-API זמינים במאמר בנושא נתוני מסירה מצטברים. אפשר גם לעיין בכלי לבדיקת API.

  • התראות דרך שרת proxy. ההתראות שמועברות דרך שרת proxy לא ייספרו במדדי המסירה הנוכחיים של FCM או GA, ולכן יכול להיות שתחוו ירידה של עד 15% במדדי מסירת ההתראות. כדי לדווח על הודעות שעברו דרך שרת proxy, צריך להשתמש ב-FCM Aggregate Delivery Data API. בדוח ProxyNotificationInsightPercents מוצג אחוז ההודעות שהועברו בהצלחה דרך השרת, וגם פרטים על הודעות שלא ניתן להעביר דרך השרת.

פתרון בעיות שקשורות לעיכובים בהתראות

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

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

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