אם שרת האפליקציה מטמיע את פרוטוקול XMPP Connection Server, הוא יכול לקבל הודעות ממעלה הזרם ממכשיר של משתמש לענן. כדי להתחיל שליחת הודעה ב-upstream, אפליקציית הלקוח שולחת בקשה שמכילה את הפרטים הבאים:
- הכתובת של שרת האפליקציה המקבל בפורמט
SENDER_ID@fcm.googleapis.com
. - מזהה הודעה שצריך להיות ייחודי לכל מזהה שולח.
- נתוני ההודעה שמכילים את צמדי המפתח/ערך של מטען הייעודי (payload) של ההודעה.
כשהנתונים האלה מתקבלים, FCM יוצר סטנזה של XMPP כדי לשלוח לשרת האפליקציה, ומוסיף מידע נוסף על המכשיר והאפליקציה ששולחים את ההודעה.
שליחת הודעה ב-upstream מאפליקציית לקוח ל-Android
אפליקציית Android יכולה לשלוח הודעה למקור באמצעות 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.