הגדרה וניהול של רמת העדיפות של הודעות ב-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 ומה-API בארכיטקטורת REST של FCM, צריך לעדכן את המטען הייעודי (payload) של ההודעה בפורמט 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"
          }
      }
  }
}

בדיקת ההתראות בעדיפות גבוהה במצב Doze

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

  1. מגדירים את המכשיר למצב Doze לפי ההוראות במאמר בדיקת האפליקציה במצב Doze.
  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 או ממשקי 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()‎.

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

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

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

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

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

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