Gửi tin nhắn ngược dòng trên Android

Nếu máy chủ ứng dụng của bạn triển khai giao thức XMPP Connection Server (Máy chủ kết nối XMPP), thì máy chủ đó có thể nhận thông báo ngược dòng từ thiết bị của người dùng lên đám mây. Để bắt đầu thông báo ngược dòng, ứng dụng khách sẽ gửi một yêu cầu có chứa nội dung sau:

  • Địa chỉ của máy chủ ứng dụng nhận ở định dạng SENDER_ID@fcm.googleapis.com.
  • Mã nhận dạng thư phải là duy nhất cho mỗi mã người gửi.
  • Dữ liệu thông báo bao gồm các cặp khoá-giá trị trong tải trọng của thông báo.

Khi nhận được dữ liệu này, FCM sẽ tạo một thông báo XMPP để gửi đến máy chủ ứng dụng, thêm một số thông tin bổ sung về ứng dụng và thiết bị gửi.

Gửi thông báo ngược dòng từ ứng dụng khách Android

Ứng dụng Android có thể gửi tin nhắn ngược dòng bằng 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());

Xử lý lệnh gọi lại thông báo ngược dòng (upstream)

Với FirebaseMessaging, bạn có thể triển khai lệnh gọi lại onMessageSentonSendError để kiểm tra trạng thái của các tin nhắn tải lên. Trong các trường hợp lỗi, onSendError sẽ trả về SendException kèm theo mã lỗi. Ví dụ: nếu ứng dụng cố gắng gửi thêm tin nhắn sau khi đạt đến giới hạn 20 tin nhắn, ứng dụng sẽ trả về SendException#ERROR_TOO_MANY_MESSAGES.

Trong trường hợp thiết bị không có kết nối mạng hoặc không thể sử dụng dịch vụ FCM để chuyển tiếp các thông báo ngược dòng đến máy chủ của bạn, các phiên bản ứng dụng Android có thể tích luỹ tối đa 20 tin nhắn đang chờ xử lý. Nếu các thông báo đó hết hạn trước khi FCM có thể gửi thành công, thì onSendError sẽ trả về SendException#ERROR_TTL_EXCEEDED.

Để tối ưu hoá mức sử dụng mạng, FCM sẽ phản hồi theo lô cho onMessageSentonSendError, vì vậy, quá trình xác nhận có thể không có sẵn ngay cho từng thông báo.

Nhận thông báo XMPP trên máy chủ ứng dụng

Khi nhận được lệnh gọi nhắn tin ngược dòng từ một ứng dụng khách, FCM sẽ tạo thông báo XMPP cần thiết để gửi thông báo ngược dòng. FCM thêm các trường categoryfrom, sau đó gửi một thông điệp như sau đến máy chủ ứng dụng:

<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>

Đang gửi thông báo ACK

Để phản hồi một thông báo ngược dòng như trên, máy chủ ứng dụng phải sử dụng cùng một kết nối để gửi thông báo ACK chứa mã nhận dạng thông báo duy nhất. Nếu không nhận được ACK, FCM có thể thử gửi lại thông báo đến máy chủ ứng dụng.

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

Hãy xem Tài liệu tham khảo về máy chủ kết nối XMPP để biết thêm thông tin về cú pháp thông báo ngược dòng.