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

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

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

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

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

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

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

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

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

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

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

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

אפשר לשלוח התראות למשתמשים באמצעות Admin SDK,‏ FCM API בארכיטקטורת REST ומסוף 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 Services.

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

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

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

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

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

התנהגות ברירת המחדל של אפליקציות שמשתמשות ב-Android מגרסה Q ואילך וב-Google Play Services מגרסה 19054000 ואילך היא העברת הודעות התראה דרך שרת proxy. הודעות שנשלחות דרך 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 יכול לדווח על אחוז ההודעות ל-Android שקיבלו עדיפות נמוכה יותר מתוך כל ההודעות. יכול להיות שחלק מההודעות לא ייכללו בדוחות של הנתונים המצטברים, אבל בסך הכול הם אמורים לספק תמונה כללית של שיעורי העדיפות הנמוכה של ההודעות. מידע נוסף וקוד לדוגמה לשליחת שאילתות ל-API זמינים במאמר בנושא נתוני מסירה מצטברים. אפשר גם לעיין בנתונים בAPI explorer.

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

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

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

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

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