XMPP 연결 서버 프로토콜을 앱 서버에 구현하면 사용자의 기기에서 클라우드로 보낸 업스트림 메시지를 수신할 수 있습니다. 업스트림 메시지를 시작하기 위해 클라이언트 앱에서 다음을 포함한 요청을 보냅니다.
SENDER_ID@fcm.googleapis.com
형식의 수신 앱 서버 주소- 발신자 ID마다 고유한 메시지 ID
- 메시지 페이로드의 키-값 쌍을 구성하는 메시지 데이터
수신된 데이터에 전송 기기와 앱에 대한 추가 정보를 더해 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 메시지 전송
앱 서버는 위와 같은 업스트림 메시지에 대한 응답으로 반드시 동일한 연결을 사용하여 고유한 메시지 ID가 포함된 ACK 메시지를 전송해야 합니다. FCM에서 ACK를 수신하지 못하면 앱 서버에 메시지 전송을 재시도할 수 있습니다.
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
업스트림 메시지 문법의 자세한 내용은 XMPP 연결 서버 참조를 확인하세요.