יש שתי אפשרויות להקצאת עדיפות למסירה של הודעות במורד הזרם ב-Android: עדיפות רגילה ועדיפות גבוהה. המסירה של הודעות בעדיפות רגילה ובעדיפות גבוהה פועלת כך:
עדיפות רגילה. זוהי עדיפות ברירת המחדל להודעות נתונים והודעות. הודעות בעדיפות רגילה נשלחות מיד כשהמכשיר לא במצב שינה. כשהמכשיר נמצא במצב חיסכון בסוללה, יכול להיות שהמסירה תתעכב כדי לחסוך בסוללה עד שהמכשיר ייצא מהמצב הזה. להודעות פחות דחופות, כמו התראות על אימיילים חדשים, סנכרון של ממשק המשתמש או סנכרון של נתוני האפליקציה ברקע, כדאי לבחור בעדיפות מסירה רגילה.
עדיפות גבוהה.FCM מנסה להעביר הודעות בעדיפות גבוהה באופן מיידי, ומאפשר ל-FCM להעיר מכשיר במצב שינה כשצריך ולהפעיל עיבוד מוגבל (כולל גישה מוגבלת מאוד לרשת). הודעות בעדיפות גבוהה אמורות בדרך כלל לגרום לאינטראקציה של המשתמש עם האפליקציה או עם ההתראות שלה.
איך בוחרים בין הודעות בעדיפות גבוהה להודעות בעדיפות רגילה
הודעות בעדיפות רגילה מתאימות לעדכונים כלליים, אבל כדאי לבחור בעדיפות גבוהה כשצריך להבטיח מסירה מיידית של עניינים או פעולות דחופים. מצב Doze יכול להשפיע על זמן האספקה של הודעות בעדיפות רגילה, לכן כדאי להגדיר את רוב ההתראות שגלויות למשתמשים בעדיפות גבוהה כדי להבטיח שהן יימסרו במהירות. לדוגמה, התראות כמו הודעות בצ'אט, בעיות בחשבון או עדכונים לגבי משלוחי אוכל צריכות להיות מוגדרות בעדיפות גבוהה.
עיבוד הודעות בעדיפות גבוהה ורגילה
בהודעות בעדיפות גבוהה ובעדיפות רגילה שמתקבלות במכשיר Android, ניתנות כמה שניות לעיבוד המטען הייעודי (payload) של ההודעה ב-handler של onMessageReceived, ומוקצה קצת יותר זמן להודעות בעדיפות גבוהה מאשר להודעות בעדיפות רגילה. הזמן הזה אמור להיות ארוך מספיק רק כדי להציג התראה באופן מיידי. אם אתם צריכים לבצע פעולות נוספות, כמו טעינת תמונה מהאחסון במכשיר או קריאה לשרתים שלכם כדי לאסוף תוכן נוסף, תצטרכו לבצע שלבים נוספים.
השיטה onMessageReceived נקראת ב-Thread עובד נפרד. השיטה המומלצת היא לעבד את המטען הייעודי (payload) של ההודעה ולהציג התראה באופן מיידי בתוך ה-method onMessageReceived. אין לבצע קריאות אסינכרוניות נוספות לרשת או עיבוד של המטען הייעודי (payload) בשרשור נפרד בתוך השיטה onMessageReceived. פעולות כאלה עלולות לגרום לכך שהאפליקציה תהיה מחוץ למחזור חיים תקין של תהליך לפני שהמטען הייעודי יעבור עיבוד מלא. במקרה כזה, יכול להיות שתראו שהודעות FCM מסוימות שנשלחות גורמות לעיכוב בהתראות או לכך שהן לא מופיעות.
אם אתם צריכים עוד זמן כדי לעבד את ההודעה, למשל כדי לאחזר imageUrl שכלול במטען הייעודי (payload) של ההודעה, תצטרכו להשתמש במבנה כמו WorkManager או בשירות שפועל בחזית כדי להאריך את מחזור החיים של האפליקציה. כדי לוודא שההתראות מעובדות באופן מלא, כדאי להשתמש בהנחיות הבאות כשאתם מבטלים את השיטה onMessageReceived.
- להתראות בעדיפות גבוהה: מפעילים משימה בעדיפות גבוהה באמצעות
WorkManagerשל Android כדי לוודא שההתראה בעדיפות גבוהה מקבלת זמן עיבוד בעדיפות גבוהה, וכדי לוודא שהעיבוד של ההתראה מסתיים. החדשות הטובות הן שאם אתם חוששים שתנצלו את כל המכסות של המשימות בעדיפות גבוהה בגלל עיבוד של FCM בעדיפות גבוהה, אין לכם סיבה לדאוג. יש פטור קצר למשימות בעדיפות גבוהה שנקבעו מיד אחרי שנשלחה הודעת FCMonMessageReceivedבעדיפות גבוהה. - להתראות בעדיפות רגילה: צריך להפעיל
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
כדי לוודא שההתראות בעדיפות גבוהה מתקבלות ומעובדות בצורה תקינה כשהן מתקבלות אצל המשתמש, צריך לפעול לפי ההוראות הבאות כדי לבדוק את ההתראות:
- מגדירים את המכשיר למצב Doze לפי ההוראות במאמר בדיקת האפליקציה במצב Doze.
- ניגשים לטוקן הרישום של FCM מהאפליקציה במכשיר הבדיקה. למידע נוסף על אופן הגישה לאסימון, ראו שליחת הודעת בדיקה לאפליקציה שפועלת ברקע.
- אחרי שמקבלים את הטוקן של 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 ואילך וב-Google Play Services בגרסה 19054000 ואילך. הודעות שנשלחות דרך 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 כדי לטפל בכך ברקע.