יש שתי אפשרויות להקצאת עדיפות מסירה להודעות במורד הזרם ב-Android: עדיפות רגילה ועדיפות גבוהה. כך מתבצעת השליחה של הודעות בעדיפות רגילה ובעדיפות גבוהה:
עדיפות רגילה. זוהי העדיפות שמוגדרת כברירת מחדל להודעות נתונים ולהודעות התראות. הודעות בעדיפות רגילה נשלחות באופן מיידי כשהמכשיר לא במצב שינה. כשהמכשיר נמצא במצב שינה, יכול להיות שהמסירה תתעכב כדי לחסוך בסוללה עד שהמכשיר יצא ממצב שינה. להודעות שפחות דחופות, כמו התראות על אימייל חדש, שמירה על סנכרון של ממשק המשתמש או סנכרון של נתוני האפליקציה ברקע, בוחרים בעדיפות מסירה רגילה.
עדיפות גבוהה.FCM מנסה להעביר הודעות בעדיפות גבוהה באופן מיידי, ומאפשר ל-FCM להוציא מכשיר ממצב שינה כשצריך, ולהפעיל עיבוד מוגבל (כולל גישה מוגבלת מאוד לרשת). הודעות בעדיפות גבוהה צריכות בדרך כלל להוביל לאינטראקציה של המשתמש עם האפליקציה או עם ההתראות שלה.
ההבדל בין הודעות עם עדיפות גבוהה לבין הודעות עם עדיפות רגילה
הודעות בעדיפות רגילה מתאימות לעדכונים כלליים, אבל אם אתם רוצים לוודא שההודעה תגיע באופן מיידי בנושאים דחופים או פעולות דחופות, כדאי לבחור בעדיפות גבוהה. מכיוון שמצב שינה יכול להשפיע על זמן המסירה של הודעות בעדיפות רגילה, כדאי להגדיר את רוב ההתראות שגלויות למשתמשים כהתראות בעדיפות גבוהה כדי להבטיח שהן יימסרו במהירות. לדוגמה, התראות כמו הודעות בצ'אט, בעיות בחשבון או עדכונים לגבי משלוח אוכל צריכות להיות בעדיפות גבוהה.
עיבוד הודעות עם עדיפות גבוהה ועדיפות רגילה
גם בהודעות בעדיפות גבוהה וגם בהודעות בעדיפות רגילה שמתקבלות במכשיר Android, מוקצות כמה שניות לעיבוד מטען הייעודי (payload) של ההודעה ב-handler onMessageReceived. בהודעות בעדיפות גבוהה מוקצה קצת יותר זמן מאשר בהודעות בעדיפות רגילה. הזמן הזה אמור להיות ארוך מספיק רק כדי להציג התראה באופן מיידי. אם אתם צריכים לבצע פעולות נוספות, כמו טעינת תמונה מאחסון המכשיר או התקשרות לשרתים כדי לאסוף תוכן נוסף, תצטרכו לבצע שלבים נוספים.
השיטה onMessageReceived נקראת ב-Thread עובד נפרד. מומלץ לעבד את מטען הנתונים של ההודעה ולהציג התראה באופן מיידי בשיטה onMessageReceived. אסור לבצע קריאות נוספות אסינכרוניות לרשת או לעבד מטען ייעודי (payload) בשרשור נפרד בתוך השיטה onMessageReceived. פעולה כזו עלולה לגרום לכך שהאפליקציה לא תהיה בתוך מחזור חיים תקין של תהליך לפני שהמטען הייעודי יעבור עיבוד מלא. במקרה כזה, יכול להיות שתבחינו בכך שהודעות FCM מסוימות שנשלחות גורמות לעיכובים בהצגת ההתראות או לכך שההתראות לא מוצגות בכלל.
אם אתם צריכים עוד זמן כדי לעבד את ההודעה, למשל כדי לאחזר imageUrl שכלול במטען הייעודי (payload) של ההודעה, תצטרכו להשתמש במבנה כמו WorkManager או בשירות שפועל בחזית כדי להאריך את מחזור החיים של האפליקציה. כדי לוודא שההתראות שלכם עברו עיבוד מלא, מומלץ לפעול לפי ההנחיות הבאות כשמבטלים את השיטה onMessageReceived.
- להתראות עם עדיפות גבוהה: מתחילים משימה בעדיפות גבוהה באמצעות
WorkManagerב-Android כדי לוודא שההתראה עם העדיפות הגבוהה מקבלת זמן עיבוד מתועדף, וכך לוודא שהרינדור של ההתראה מסתיים. החדשות הטובות הן שאם אתם חוששים שתחרגו ממכסות העבודות המואצות בגלל עיבוד של הודעות FCM עם עדיפות גבוהה, אתם לא צריכים לדאוג. יש פטור קצר לעבודות מואצות שמתוזמנות מיד אחרי שליחה של הודעת FCMonMessageReceivedבעדיפות גבוהה. - להתראות בעדיפות רגילה: במקום זאת, צריך להפעיל התראה רגילה
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"
}
}
}
}
בדיקת התראות בעדיפות גבוהה במצב נמנום
כדי לוודא שההתראות בעדיפות גבוהה מתקבלות ומעובדות בצורה נכונה כשהמשתמש מקבל אותן, צריך לפעול לפי ההוראות הבאות כדי לבדוק את ההתראות:
- מגדירים את המכשיר למצב שינה באמצעות ההוראות שבמאמר בדיקת האפליקציה במצב שינה.
- ניגשים לטוקן הרישום של FCM מהאפליקציה במכשיר הבדיקה. מידע נוסף על גישה לאסימון זמין במאמר בנושא שליחת הודעת בדיקה לאפליקציה ברקע.
- אחרי שמקבלים את אסימון 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 מדווח רק אחרי שהאפליקציה מתחילה לפעול, ויכול להיות שלא ידווח בכלל אם ההתראה לא תוביל לפתיחת האפליקציה.
התנהגות ברירת המחדל של אפליקציות שמשתמשות ב-Android Q ומעלה וב-Google Play Services בגרסה 19054000 ואילך היא העברת הודעות התראה דרך שרת proxy. הודעות שנשלחות דרך 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(), כדי לקבוע אם העדיפות של הודעה מסוימת הופחתה או לא.
כל ההודעות. FCM Aggregate Delivery Data API יכול לדווח על האחוז מכל ההודעות שלכם ל-Android שמועברות בסדר עדיפות נמוך יותר. יכול להיות שחלק מההודעות לא ייכללו בדוחות של נתונים מצטברים, אבל בסך הכול הם אמורים לספק תמונה כללית של שיעורי ההורדה מסדר העדיפויות של הודעות. מידע נוסף וקוד לדוגמה לשאילתות ב-API זמינים במאמר בנושא נתוני מסירה מצטברים. אפשר גם לעיין בכלי API Explorer.
התראות דרך שרת proxy. ההתראות שמועברות דרך שרת proxy לא ייספרו במדדי המסירה הנוכחיים של FCM או GA, ולכן יכול להיות שתחוו ירידה של עד 15% במדדי מסירת ההתראות. כדי לדווח על הודעות שעברו דרך שרת proxy, משתמשים ב-FCM Aggregate Delivery Data API.
ProxyNotificationInsightPercentsמציג את אחוז ההתראות שהועברו בהצלחה דרך השרת, וגם פרטים על הודעות שלא ניתן להעביר דרך השרת.
פתרון בעיות שקשורות לעיכובים בהתראות
מוודאים שההתראות מופעלות במופע האפליקציה. אם המשתמש השבית את הרשאה לשליחת התראות לאפליקציה שלכם, אף אחת מההתראות שלכם לא תפורסם, וכתוצאה מכך, ההודעות שלכם יקבלו עדיפות נמוכה יותר. לפני ששולחים הודעות בעדיפות גבוהה למופע של אפליקציה, צריך לוודא שההתראות מופעלות.
מומלץ להימנע מביצוע שיחות נוספות לרשת בזמן עיבוד ההתראה. חלק קטן מאוכלוסיית משתמשי Android נמצא ברשתות עם זמן אחזור גבוה, ולכן מומלץ להימנע מפתיחת חיבור לשרתים לפני הצגת ההתראה. יכול להיות שיהיה מסוכן למשתמשים ברשתות עם זמן אחזור גבוה להתקשר בחזרה לשרת לפני סיום הזמן המותר לעיבוד.
במקום זאת, צריך לכלול את תוכן ההתראה בהודעת FCM ולהציג אותו באופן מיידי. אם אתם צריכים לסנכרן תוכן נוסף באפליקציה ב-Android, אתם יכולים לתזמן משימה באמצעות WorkManager כדי שהסנכרון יתבצע ברקע.