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 , nó có thể nhận các tin nhắn ngược dòng từ thiết bị của người dùng lên đám mây. Để bắt đầu một tin nhắn ngược dòng, ứng dụng khách sẽ gửi một yêu cầu có nội dung sau:
- Địa chỉ của máy chủ ứng dụng nhận ở định dạng
SENDER_ID@fcm.googleapis.com
. - ID tin nhắn phải là duy nhất cho mỗi ID người gửi .
- Dữ liệu tin nhắn bao gồm các cặp khóa-giá trị của tải trọng tin nhắn.
Khi nhận được dữ liệu này, FCM sẽ xây dựng một khổ XMPP để gửi đến máy chủ ứng dụng, bổ sung một số thông tin bổ sung về thiết bị gửi và ứng dụng.
Gửi tin nhắn ngược dòng từ ứng dụng khách Android
Ứng dụng Android của bạn 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ý các cuộc gọi lại tin nhắn ngược dòng
Với FirebaseMessaging
, bạn có thể triển khai các lệnh gọi lại onMessageSent
và onSendError
để kiểm tra trạng thái của các tin nhắn ngược dòng. Trong trường hợp lỗi, onSendError
trả về SendException
kèm theo mã lỗi. Ví dụ: nếu khách hàng cố gắng gửi thêm tin nhắn sau khi đạt đến giới hạn 20 tin nhắn, nó sẽ trả về SendException#ERROR_TOO_MANY_MESSAGES
.
Trong trường hợp thiết bị ngoại tuyến hoặc dịch vụ FCM không khả dụng để chuyển tiếp tin nhắn ngược dòng tới máy chủ của bạn, phiên bản ứng dụng khách Android có thể tích lũy tối đa 20 tin nhắn đang chờ xử lý. Nếu những tin nhắn đó hết hạn trước khi FCM có thể gửi chúng thành công, onSendError
sẽ trả về SendException#ERROR_TTL_EXCEEDED
.
Để tối ưu hóa việc sử dụng mạng, FCM sẽ phân nhóm các phản hồi cho onMessageSent
và onSendError
, do đó, việc xác nhận có thể không ngay lập tức đối với mỗi tin nhắn.
Nhận tin nhắn XMPP trên máy chủ ứng dụng
Khi FCM nhận được cuộc gọi nhắn tin ngược dòng từ ứng dụng khách, nó sẽ tạo khổ XMPP cần thiết để gửi tin nhắn ngược dòng. FCM thêm category
và from
các trường, sau đó gửi một đoạn 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 tin nhắn ACK
Để phản hồi tin nhắn 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 tin nhắn ACK chứa ID tin nhắn duy nhất. Nếu FCM không nhận được ACK, nó có thể thử gửi lại tin nhắn đế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>
Xem Tham khảo 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.