אם שרת האפליקציה מטמיע את פרוטוקול XMPP Connection Server, הוא יכול לקבל הודעות ממעלה הזרם ממכשיר של משתמש לענן. כדי להתחיל שליחת הודעה ב-upstream, אפליקציית הלקוח שולחת בקשה שמכילה את הפרטים הבאים:
- הכתובת של שרת האפליקציה המקבל בפורמט
SENDER_ID@fcm.googleapis.com
. - מזהה הודעה שצריך להיות ייחודי לכל מזהה שולח.
- נתוני ההודעה שמכילים את צמדי המפתח/ערך של מטען הייעודי (payload) של ההודעה.
כשהנתונים האלה מתקבלים, FCM יוצר סטנזה של XMPP כדי לשלוח לשרת האפליקציה, ומוסיף מידע נוסף על המכשיר והאפליקציה ששולחים את ההודעה.
שליחת הודעה ב-upstream מאפליקציית לקוח ל-Android
אפליקציית Android יכולה לשלוח הודעה ב-upstream באמצעות FirebaseMessaging.send:
Kotlin+KTX
val fm = Firebase.messaging fm.send( remoteMessage("$SENDER_ID@fcm.googleapis.com") { setMessageId(messageId.toString()) addData("my_message", "Hello World") addData("my_action", "SAY_HELLO") }, )
Java
FirebaseMessaging fm = FirebaseMessaging.getInstance(); fm.send(new RemoteMessage.Builder(SENDER_ID + "@fcm.googleapis.com") .setMessageId(Integer.toString(messageId)) .addData("my_message", "Hello World") .addData("my_action","SAY_HELLO") .build());
טיפול בקריאות חזרה (callbacks) של הודעות במעלה הזרם
באמצעות FirebaseMessaging
, אפשר להטמיע את הפונקציות החוזרות onMessageSent
ו-onSendError
כדי לבדוק את הסטטוס של הודעות במקור. במקרים של שגיאה, הפונקציה onSendError
מחזירה SendException
עם קוד שגיאה. לדוגמה, אם הלקוח ינסה לשלוח עוד הודעות אחרי שמגיעים למגבלה של 20 הודעות, הוא יחזיר את הערך SendException#ERROR_TOO_MANY_MESSAGES
.
במקרים שבהם המכשיר במצב אופליין או שהשירות FCM לא זמין להעברת הודעות ממעלה הזרם לשרת, מכונות של אפליקציות לקוח ל-Android יכולות לצבור עד 20 הודעות בהמתנה.
אם התוקף של הודעות כאלה יפוג לפני ש-FCM תוכל לשלוח אותן בהצלחה, הפונקציה onSendError
תחזיר את הערך SendException#ERROR_TTL_EXCEEDED
.
כדי לבצע אופטימיזציה של השימוש ברשת, FCM אוסף את התשובות ל-onMessageSent
ול-onSendError
, כך שיכול להיות שהאישור לא יגיע באופן מיידי לכל הודעה.
קבלת הודעות XMPP בשרת האפליקציה
כש-FCM מקבל קריאה להעברת הודעות ב-upstream מאפליקציית לקוח, הוא יוצר את סטנזה ה-XMPP הנדרשת לשליחת ההודעה ב-upstream.
FCM מוסיף את השדות category
ו-from
, ולאחר מכן שולח סטנזה כמו זו לשרת האפליקציה:
<message id=""> <gcm xmlns="google:mobile:data"> { "category":"com.example.yourapp", // to know which app sent it "data": { "hello":"world", }, "message_id":"m-123", "from":"REGID" } </gcm> </message>
שליחת הודעת ACK
בתגובה להודעה מ-upstream כמו זו שלמעלה, שרת האפליקציה חייב להשתמש באותו חיבור כדי לשלוח הודעת ACK שמכילה את מזהה ההודעה הייחודי. אם FCM לא מקבל ACK, הוא יכול לנסות שוב לשלוח את ההודעה לשרת האפליקציה.
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
מידע נוסף על תחביר ההודעות ב-upstream זמין במאמר חומר עזר בנושא שרת חיבורי XMPP.