שליחת הודעות ב-upstream ב-Android

אם שרת האפליקציה מטמיע את פרוטוקול 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.