Android에서 업스트림 메시지 전송

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으로 onMessageSentonSendError 콜백을 구현하여 업스트림 메시지의 상태를 확인할 수 있습니다. 오류가 발생하면 onSendError가 오류 코드와 함께 SendException을 반환합니다. 예를 들어 클라이언트가 메시지 20개 한도에 도달한 후에 메시지를 더 보내려고 시도하면 SendException#ERROR_TOO_MANY_MESSAGES를 반환합니다.

기기가 오프라인 상태이거나 FCM 서비스가 서버에 업스트림 메시지를 전달할 수 없는 경우에는 Android 클라이언트 앱 인스턴스에 대기 중인 메시지가 최대 20개까지 누적될 수 있습니다. FCM이 메시지 전송에 성공하기 전에 이러한 메시지가 만료되면 onSendErrorSendException#ERROR_TTL_EXCEEDED를 반환합니다.

FCM은 네트워크 사용을 최적화하기 위해 onMessageSentonSendError에 대한 응답을 일괄 처리하므로 각 메시지에 대한 수신 확인이 다소 지연될 수 있습니다.

앱 서버에서 XMPP 메시지 수신

FCM은 클라이언트 앱의 업스트림 메시징 호출을 수신하면 업스트림 메시지를 보내는 데 필요한 XMPP 스탠자를 생성합니다. FCM에서 categoryfrom 필드를 추가한 다음 앱 서버에 다음과 같은 스탠자를 보냅니다.

<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 연결 서버 참조를 확인하세요.