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