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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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