C++의 주제 메시징

FCM 주제 메시징을 사용하면 게시/구독 모델을 기반으로 특정 주제를 구독하는 여러 기기에 메시지를 보낼 수 있습니다. 필요에 따라 주제 메시지를 작성하면 FCM에서 라우팅을 처리하여 올바른 기기에 정확히 전달합니다.

예를 들어, 지역 조수 예보 앱 사용자는 '조류 특보' 주제를 구독하여 해당 지역에서 최적의 바다 낚시 상태 알림을 수신할 수 있습니다. 스포츠 앱 사용자는 응원하는 팀의 경기 점수 실황 자동 업데이트를 구독할 수 있습니다.

주제와 관련된 주의사항은 다음과 같습니다.

  • 주제 메시징은 날씨 등 공개적으로 제공되는 정보에 가장 적합합니다.
  • 주제 메시지는 지연 시간이 아닌 처리량을 위주로 최적화됩니다. 기기 한 대나 적은 수의 기기에 빠르고 안전하게 전달하려면 주제가 아닌 등록 토큰으로 메시지를 타겟팅하세요.
  • 사용자를 기준으로 여러 기기에 메시지를 보내야 하는 경우 기기 그룹 메시징을 사용하세요.
  • 주제 메시징에서 각 주제에 지원하는 구독에는 제한이 없습니다. 그러나 FCM은 다음 영역에 제한을 두고 있습니다.
    • 하나의 앱 인스턴스는 최대 2,000개까지 주제를 구독할 수 있습니다.
    • 일괄 가져오기를 사용하여 앱 인스턴스를 구독하는 경우 각 요청은 1,000개의 앱 인스턴스로 제한됩니다.
    • 새 구독의 빈도는 프로젝트별로 비율이 제한됩니다. 단기간에 지나치게 많은 구독 요청을 보내는 경우 FCM 서버는 429 RESOURCE_EXHAUSTED('할당량 초과') 응답을 보냅니다. 지수 백오프로 다시 시도하세요.

클라이언트 앱에서 주제 구독

주제를 구독하려면 애플리케이션에서 ::firebase::messaging::Subscribe를 호출합니다. 이렇게 하면 FCM 백엔드로 비동기 요청이 전송되고 클라이언트가 지정된 주제를 구독하게 됩니다.

::firebase::messaging::Subscribe("example");

최초 구독 요청에 실패하면 FCM이 주제 구독에 성공할 때까지 다시 시도합니다. 앱이 시작될 때마다 FCM은 요청된 모든 주제가 구독되었는지 확인합니다.

구독을 취소하려면 ::firebase::messaging::Unsubscribe를 호출합니다. 그러면 FCM이 백그라운드에서 주제를 구독 취소합니다.

서버에서 주제 구독 관리

Instance ID API를 활용하여 서버 쪽에서 기본적인 주제 관리 작업을 할 수 있습니다. 클라이언트 앱 인스턴스의 등록 토큰을 알고 있으면 다음이 가능합니다.

주제 메시지 수신 및 처리

FCM은 다른 다운스트림 메시지와 동일한 방식으로 주제 메시지를 전송합니다.

::firebase::messaging::Listener::OnMessage 메소드를 재정의하면 수신된 메시지를 기준으로 작업을 수행하고 메시지 데이터를 가져올 수 있습니다.

void OnMessage(const ::firebase::messaging::Message& message) {
  LogMessage(TAG, "From: %s", message.from.c_str());
  LogMessage(TAG, "Message ID: %s", message.message_id.c_str());
}

보내기 요청 작성

Firebase 클라우드 메시징 주제로 메시지를 보내는 것은 개별 기기나 사용자 그룹으로 메시지를 보내는 것과 매우 비슷합니다. 앱 서버는 메시지 본문의 topic 키를 yourTopic 등의 값으로 설정합니다. 개발자는 다음 정규 표현식과 일치하는 모든 주제 이름을 선택할 수 있습니다. "[a-zA-Z0-9-_.~%]+"

여러 주제를 조합하여 보내려면 앱 서버에서 condition 키를 대상 주제를 지정하는 부울 조건으로 설정합니다. 예를 들어 TopicA와 함께 TopicB 또는 TopicC를 구독한 기기로 메시지를 보내는 방법은 다음과 같습니다.

'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)

FCM이 먼저 괄호의 모든 조건을 확인한 다음 왼쪽에서 오른쪽으로 표현식을 확인합니다. 위 표현식에서는 주제 1개를 구독한 사용자는 메시지를 수신하지 않습니다. 또한 TopicA를 구독하지 않은 사용자도 메시지를 수신하지 않습니다. 다음과 같이 조합되어야 메시지를 수신합니다.

  • TopicA 및 TopicB
  • TopicA 및 TopicC

조건식에 최대 5개의 주제를 포함할 수 있으며 괄호가 지원됩니다. 지원되는 연산자는 &&, ||, !입니다. !의 사용법은 다음과 같습니다.

!('TopicA' in topics)

이 식을 사용하면 어떠한 주제도 구독하지 않는 앱 인스턴스를 포함하여 TopicA를 구독하지 않는 모든 앱 인스턴스가 메시지를 수신합니다.

앱 서버 키에 대한 자세한 내용은 참조 정보를 확인하세요.

주제 HTTP POST 요청

주제 1개로 보내는 방법은 다음과 같습니다.

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
    "topic" : "foo-bar",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

cURL로 보내는 방법은 다음과 같습니다.

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "message": {
    "topic" : "foo-bar",
    "notification": {
      "body": "This is a Firebase Cloud Messaging Topic Message!",
      "title": "FCM Message"
    }
  }
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

'dogs' 또는 'cats' 주제를 구독한 기기로 보내는 방법은 다음과 같습니다.

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
   "message":{
    "condition": "'dogs' in topics || 'cats' in topics",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message",
    }
  }
}

cURL로 보내는 방법은 다음과 같습니다.

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "notification": {
    "title": "FCM Message",
    "body": "This is a Firebase Cloud Messaging Topic Message!",
  },
  "condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

주제 HTTP 응답

{
    "name": "projects/myproject-b5ae1/messages/5735743068807585451"
}

메시지 옵션의 전체 목록은 HTTP v1 API 참조를 확인하세요.

다음 단계

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.