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, ứng dụng 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ề thiết bị và ứng dụng 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 thông báo ngược dòng 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 thông báo ngược dòng (upstream)
Với FirebaseMessaging
, bạn có thể triển khai
gọi lại onMessageSent
và onSendError
để kiểm tra trạng thái của thượng nguồn
tin nhắn. Trong các trường hợp lỗi, onSendError
sẽ trả về SendException
có mã lỗi. Ví dụ: nếu khách hàng cố gắng
gửi thêm tin nhắn sau khi đạt giới hạn 20 tin nhắn thì tin nhắn 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 FCM
dịch vụ không khả dụng cho
chuyển tiếp 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 khách Android có thể
tích luỹ 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 thành công
kết quả, onSendError
sẽ trả về SendException#ERROR_TTL_EXCEEDED
.
Để tối ưu hoá việc sử dụng mạng, FCM sẽ phản hồi theo lô cho onMessageSent
và onSendError
, vì vậy, xác nhận có thể không có ngay 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 một lệnh gọi nhắn tin ngược dòng (upstream) từ một ứng dụng khách, FCM sẽ tạo
đoạn mã XMPP cần thiết để gửi thông điệp ngược dòng.
FCM thêm các trường category
và from
, sau đó gửi một
stanza 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ư. Nếu FCM không nhận được ACK, thì ứng dụng 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>
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 truyền lên.