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 Máy chủ kết nối XMPP, thì máy chủ này có thể nhận thông báo ngược từ thiết bị của người dùng đến đám mây. Để bắt đầu một thông báo ngược dòng, ứng dụng khách sẽ gửi một yêu cầu chứa những thông tin sau:

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

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

Gửi tin nhắn ngược từ ứng dụng khách Android

Ứng dụng Android của bạn có thể gửi thông báo ngược bằng cách sử dụ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 tin nhắn ngược

Với FirebaseMessaging, bạn có thể triển khai các lệnh gọi lại onMessageSentonSendError để kiểm tra trạng thái của các thông báo ngược dòng. Trong trường hợp lỗi, onSendError sẽ trả về SendException cùng với mã lỗi. Ví dụ: nếu ứng dụng cố gắng gửi thêm thông báo sau khi đạt đến giới hạn 20 thông báo, thì ứ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 dịch vụ FCM không hoạt động để chuyển tiếp thông báo ngược dòng đến máy chủ của bạn, các thực thể ứng dụng khách Android có thể tích luỹ tối đa 20 thông báo đ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, onSendError sẽ trả về SendException#ERROR_TTL_EXCEEDED.

Để tối ưu hoá mức sử dụng mạng, FCM sẽ gửi hàng loạt phản hồi đến onMessageSentonSendError, vì vậy, thông báo xác nhận có thể không được gửi ngay lập tức cho mỗi 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 từ một ứng dụng khách, FCM sẽ tạo bản nhạc XMPP cần thiết để gửi thông báo ngược. FCM thêm các trường categoryfrom, sau đó gửi một khổ thơ 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>

Gửi thông báo xác nhận (ACK)

Để phản hồi một thông báo ngược 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ã 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.