ارسال پیام های بالادستی در اندروید

اگر سرور برنامه شما پروتکل XMPP Connection Server را پیاده سازی کند، می تواند پیام های بالادستی را از دستگاه کاربر به فضای ابری دریافت کند. برای شروع یک پیام بالادستی، برنامه مشتری درخواستی حاوی موارد زیر ارسال می کند:

  • آدرس سرور برنامه دریافت کننده در قالب SENDER_ID@fcm.googleapis.com .
  • شناسه پیامی که باید برای هر شناسه فرستنده منحصر به فرد باشد.
  • داده‌های پیام شامل جفت‌های کلید-مقدار محموله پیام است.

هنگامی که FCM این داده ها را دریافت می کند، یک مصراع XMPP برای ارسال به سرور برنامه ایجاد می کند و اطلاعات اضافی درباره دستگاه و برنامه ارسال کننده اضافه می کند.

یک پیام بالادستی از یک برنامه مشتری 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());

رسیدگی به تماس های پیام بالادست

با 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 یک تماس پیام رسانی بالادستی از یک برنامه مشتری دریافت می کند، مصراع XMPP لازم برای ارسال پیام بالادستی را تولید می کند. 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

در پاسخ به یک پیام بالادستی مانند موارد بالا، سرور برنامه باید از همان اتصال برای ارسال یک پیام ACK حاوی شناسه پیام منحصر به فرد استفاده کند. اگر FCM ACK دریافت نکند، ممکن است دوباره سعی کند پیام را به سرور برنامه ارسال کند.

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  }
  </gcm>
</message>

برای اطلاعات بیشتر در مورد نحو پیام بالادستی به مرجع XMPP Connection Server مراجعه کنید.