אם שרת האפליקציה מטמיע את פרוטוקול XMPP Connection Server, הוא יכול לקבל הודעות ממעלה הזרם ממכשיר של משתמש לענן. כדי להתחיל שליחת הודעה ב-upstream, אפליקציית הלקוח שולחת בקשה שמכילה את הפרטים הבאים:
- הכתובת של שרת האפליקציה המקבל בפורמט
SENDER_ID@fcm.googleapis.com
. - מזהה הודעה שצריך להיות ייחודי לכל מזהה שולח.
- נתוני ההודעות שמרכיבים את צמדי המפתח/ערך של המטען הייעודי (Payload) של ההודעה.
כשהוא מקבל את הנתונים האלה, FCM בונה בית XMPP לשליחה לשרת האפליקציות, הוספת עוד מידע על המכשיר והאפליקציה השולח.
שליחה של הודעת upstream מאפליקציית לקוח ב-Unity
כדי לשלוח הודעות לשרתי ה-upstream, אפליקציית לקוח של Unity יוצרת הודעה ומפעילה את Send
כפי שמוצג:
Firebase.Messaging.Message message;
message.To = SENDER_ID + "@fcm.googleapis.com";
message.MessageId = get_unique_message_id();
message.Data("my_message", "Hello World");
message.Data("my_action", "SAY HELLO");
message.TimeToLive = kTimetoLive;
Firebase.Messaging.FirebaseMessaging.Send(message);
איפה:
message.To
היא הכתובת של שרת האפליקציה המקבל בפורמטSENDER_ID@fcm.googleapis.com
.message.MessageId
הוא מזהה ייחודי של הודעה. כל הקריאות החוזרות של נמען ההודעה מזוהות על סמך מזהה ההודעה הזה.message.Data
היא מפה של מפתחות וערכים באמצעות מחרוזות.message.TimeToLive
מציין את משך הזמן (בשניות) שבו ההודעה צריכה להישמר באחסון של FCM אם המכשיר במצב אופליין. אם FCM לא יכול למסור את ההודעה לפני שהתאריך הזה פג, הוא שולח התראה חזרה ללקוח.
ספריית הלקוח FCM שומרת את ההודעה במטמון באפליקציית הלקוח ושולחת אותה כשיש ללקוח חיבור פעיל לשרת. עם קבלת ההודעה, FCM שולח אותו לשרת האפליקציות.
קבלה של הודעות 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>
אפשר לעיין בחומר העזר בנושא שרת חיבור XMPP לקבלת מידע נוסף על תחביר של הודעות upstream.