Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

앱 서버 보내기 요청 빌드

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase Admin SDK 또는 FCM 앱 서버 프로토콜을 사용하여 메시지 요청을 작성하고 다음 유형의 대상으로 보낼 수 있습니다.

  • 주제 이름
  • 상태
  • 기기 등록 토큰
  • 기기 그룹 이름(기존 프로토콜 및 Node.js용 Firebase Admin SDK만 해당)

미리 정의된 필드로 구성된 알림 페이로드, 자체 사용자 정의 필드의 데이터 페이로드 또는 두 가지 유형의 페이로드를 모두 포함하는 메시지와 함께 메시지를 보낼 수 있습니다. 자세한 내용은 메시지 유형 을 참조하세요.

이 페이지의 예는 Firebase Admin SDK( Node , Java , Python , C#Go 지원) 및 v1 HTTP 프로토콜 을 사용하여 알림 메시지를 보내는 방법을 보여줍니다. 레거시 HTTP 및 XMPP 프로토콜 을 통해 메시지를 보내기 위한 지침도 있습니다.

특정 장치에 메시지 보내기

하나의 특정 장치로 보내려면 그림과 같이 장치의 등록 토큰을 전달하십시오. 등록 토큰에 대한 자세한 내용은 플랫폼의 클라이언트 설정 정보를 참조하십시오.

노드.js

// This registration token comes from the client FCM SDKs.
const registrationToken = 'YOUR_REGISTRATION_TOKEN';

const message = {
  data: {
    score: '850',
    time: '2:45'
  },
  token: registrationToken
};

// Send a message to the device corresponding to the provided
// registration token.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

자바

// This registration token comes from the client FCM SDKs.
String registrationToken = "YOUR_REGISTRATION_TOKEN";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setToken(registrationToken)
    .build();

// Send a message to the device corresponding to the provided
// registration token.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

파이썬

# This registration token comes from the client FCM SDKs.
registration_token = 'YOUR_REGISTRATION_TOKEN'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    token=registration_token,
)

# Send a message to the device corresponding to the provided
# registration token.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

가다

// Obtain a messaging.Client from the App.
ctx := context.Background()
client, err := app.Messaging(ctx)
if err != nil {
	log.Fatalf("error getting Messaging client: %v\n", err)
}

// This registration token comes from the client FCM SDKs.
registrationToken := "YOUR_REGISTRATION_TOKEN"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Token: registrationToken,
}

// Send a message to the device corresponding to the provided
// registration token.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

씨#

// This registration token comes from the client FCM SDKs.
var registrationToken = "YOUR_REGISTRATION_TOKEN";

// See documentation on defining a message payload.
var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Token = registrationToken,
};

// Send a message to the device corresponding to the provided
// registration token.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

쉬다

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":{
      "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
      "notification":{
        "body":"This is an FCM notification message!",
        "title":"FCM Message"
      }
   }
}

cURL 명령:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
   "notification":{
     "title":"FCM Message",
     "body":"This is an FCM Message"
   },
   "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

성공하면 각 send 메서드는 메시지 ID를 반환합니다. Firebase Admin SDK는 projects/{project_id}/messages/{message_id} 형식의 ID 문자열을 반환합니다. HTTP 프로토콜 응답은 단일 JSON 키입니다.

    {
      "name":"projects/myproject-b5ae1/messages/0:1500415314455276%31bd1c9631bd1c96"
    }

여러 장치에 메시지 보내기

REST API 및 Admin FCM API를 사용하면 장치 등록 토큰 목록에 메시지를 멀티캐스트할 수 있습니다. 호출당 최대 500개의 디바이스 등록 토큰을 지정할 수 있습니다.

노드.js

// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // …
  'YOUR_REGISTRATION_TOKEN_N',
];

const message = {
  data: {score: '850', time: '2:45'},
  tokens: registrationTokens,
};

getMessaging().sendMulticast(message)
  .then((response) => {
    console.log(response.successCount + ' messages were sent successfully');
  });

자바

// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

MulticastMessage message = MulticastMessage.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .addAllTokens(registrationTokens)
    .build();
BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message);
// See the BatchResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " messages were sent successfully");

파이썬

# Create a list containing up to 500 registration tokens.
# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_N',
]

message = messaging.MulticastMessage(
    data={'score': '850', 'time': '2:45'},
    tokens=registration_tokens,
)
response = messaging.send_multicast(message)
# See the BatchResponse reference documentation
# for the contents of response.
print('{0} messages were sent successfully'.format(response.success_count))

가다

// Create a list containing up to 500 registration tokens.
// This registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}
message := &messaging.MulticastMessage{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Tokens: registrationTokens,
}

br, err := client.SendMulticast(context.Background(), message)
if err != nil {
	log.Fatalln(err)
}

// See the BatchResponse reference documentation
// for the contents of response.
fmt.Printf("%d messages were sent successfully\n", br.SuccessCount)

씨#

// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};
var message = new MulticastMessage()
{
    Tokens = registrationTokens,
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
};

var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");

쉬다

HTTP 일괄 요청을 구성합니다.

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message!"
     }
  }
}

...

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message!"
     }
  }
}
--subrequest_boundary--

요청을 파일에 저장합니다(이 예에서는 batch_request.txt). 그런 다음 cURL 명령을 사용합니다.

curl --data-binary @batch_request.txt -H 'Content-Type: multipart/mixed; boundary="subrequest_boundary"' -H 'Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA' https://fcm.googleapis.com/batch

Firebase Admin SDK의 경우 이 작업은 예제와 같이 내부적으로 sendAll() API를 사용합니다. 반환 값은 응답 목록이 입력 토큰의 순서에 해당하는 BatchResponse 입니다. 이는 오류가 발생한 토큰을 확인하려는 경우에 유용합니다.

노드.js

// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // …
  'YOUR_REGISTRATION_TOKEN_N',
];

const message = {
  data: {score: '850', time: '2:45'},
  tokens: registrationTokens,
};

getMessaging().sendMulticast(message)
  .then((response) => {
    if (response.failureCount > 0) {
      const failedTokens = [];
      response.responses.forEach((resp, idx) => {
        if (!resp.success) {
          failedTokens.push(registrationTokens[idx]);
        }
      });
      console.log('List of tokens that caused failures: ' + failedTokens);
    }
  });

자바

// These registration tokens come from the client FCM SDKs.
List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

MulticastMessage message = MulticastMessage.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .addAllTokens(registrationTokens)
    .build();
BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message);
if (response.getFailureCount() > 0) {
  List<SendResponse> responses = response.getResponses();
  List<String> failedTokens = new ArrayList<>();
  for (int i = 0; i < responses.size(); i++) {
    if (!responses.get(i).isSuccessful()) {
      // The order of responses corresponds to the order of the registration tokens.
      failedTokens.add(registrationTokens.get(i));
    }
  }

  System.out.println("List of tokens that caused failures: " + failedTokens);
}

파이썬

# These registration tokens come from the client FCM SDKs.
registration_tokens = [
    'YOUR_REGISTRATION_TOKEN_1',
    # ...
    'YOUR_REGISTRATION_TOKEN_N',
]

message = messaging.MulticastMessage(
    data={'score': '850', 'time': '2:45'},
    tokens=registration_tokens,
)
response = messaging.send_multicast(message)
if response.failure_count > 0:
    responses = response.responses
    failed_tokens = []
    for idx, resp in enumerate(responses):
        if not resp.success:
            # The order of responses corresponds to the order of the registration tokens.
            failed_tokens.append(registration_tokens[idx])
    print('List of tokens that caused failures: {0}'.format(failed_tokens))

가다

// Create a list containing up to 500 registration tokens.
// This registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}
message := &messaging.MulticastMessage{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Tokens: registrationTokens,
}

br, err := client.SendMulticast(context.Background(), message)
if err != nil {
	log.Fatalln(err)
}

if br.FailureCount > 0 {
	var failedTokens []string
	for idx, resp := range br.Responses {
		if !resp.Success {
			// The order of responses corresponds to the order of the registration tokens.
			failedTokens = append(failedTokens, registrationTokens[idx])
		}
	}

	fmt.Printf("List of tokens that caused failures: %v\n", failedTokens)
}

씨#

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};
var message = new MulticastMessage()
{
    Tokens = registrationTokens,
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
};

var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message);
if (response.FailureCount > 0)
{
    var failedTokens = new List<string>();
    for (var i = 0; i < response.Responses.Count; i++)
    {
        if (!response.Responses[i].IsSuccess)
        {
            // The order of responses corresponds to the order of the registration tokens.
            failedTokens.Add(registrationTokens[i]);
        }
    }

    Console.WriteLine($"List of tokens that caused failures: {failedTokens}");
}

쉬다

각 전송 하위 전송은 응답을 반환합니다. 응답은 --batch_ 로 시작하는 응답 경계 문자열로 구분됩니다.

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q
Content-Type: application/http
Content-ID: response-

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "name": "projects/35006771263/messages/0:1570471792141125%43c11b7043c11b70"
}

...

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q
Content-Type: application/http
Content-ID: response-

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "name": "projects/35006771263/messages/0:1570471792141696%43c11b7043c11b70"
}

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q--

주제에 메시지 보내기

클라이언트 측의 주제에 대한 클라이언트 앱 인스턴스를 구독하거나 서버 API 를 통해 주제를 만든 후 주제에 메시지를 보낼 수 있습니다. FCM에 대한 전송 요청을 처음 구축하는 경우 중요한 배경 및 설정 정보는 서버 환경 및 FCM 에 대한 가이드를 참조하십시오.

백엔드의 전송 로직에서 다음과 같이 원하는 주제 이름을 지정합니다.

노드.js

// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';

const message = {
  data: {
    score: '850',
    time: '2:45'
  },
  topic: topic
};

// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

자바

// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setTopic(topic)
    .build();

// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

파이썬

# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    topic=topic,
)

# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

가다

// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Topic: topic,
}

// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

씨#

// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";

// See documentation on defining a message payload.
var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Topic = topic,
};

// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

쉬다

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

주제 조합 으로 메시지를 보내려면 대상 주제를 지정하는 부울 표현식인 조건 을 지정하십시오. 예를 들어 다음 조건은 TopicATopicB 또는 TopicC 를 구독하는 장치에 메시지를 보냅니다.

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

FCM은 먼저 괄호 안의 조건을 평가한 다음 왼쪽에서 오른쪽으로 표현식을 평가합니다. 위 식에서 단일 주제를 구독한 사용자는 메시지를 받지 않습니다. 마찬가지로, TopicA 를 구독하지 않은 사용자는 메시지를 수신하지 않습니다. 다음 조합은 수신합니다.

  • TopicATopicB
  • TopicATopicC

조건식에 최대 5개의 주제를 포함할 수 있습니다.

조건으로 보내려면:

노드.js

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';

// See documentation on defining a message payload.
const message = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  condition: condition
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

자바

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setCondition(condition)
    .build();

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

파이썬

# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    condition=condition,
)

# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

가다

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Condition: condition,
}

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

씨#

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = new Message()
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Condition = condition,
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

쉬다

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

메시지 일괄 보내기

REST API 및 Admin SDK는 일괄 메시지 전송을 지원합니다. 최대 500개의 메시지를 단일 배치로 그룹화하고 단일 API 호출로 모두 보낼 수 있으며, 각 메시지에 대해 별도의 HTTP 요청을 보내는 것보다 성능이 크게 향상됩니다.

이 기능을 사용하여 사용자 정의된 메시지 세트를 작성하고 주제 또는 특정 장치 등록 토큰을 포함하여 다른 수신자에게 메시지를 보낼 수 있습니다. 예를 들어 메시지 본문의 세부 정보가 약간씩 다른 여러 대상에게 동시에 메시지를 보내야 하는 경우 이 기능을 사용합니다.

노드.js

// Create a list containing up to 500 messages.
const messages = [];
messages.push({
  notification: { title: 'Price drop', body: '5% off all electronics' },
  token: registrationToken,
});
messages.push({
  notification: { title: 'Price drop', body: '2% off all books' },
  topic: 'readers-club',
});

getMessaging().sendAll(messages)
  .then((response) => {
    console.log(response.successCount + ' messages were sent successfully');
  });

자바

// Create a list containing up to 500 messages.
List<Message> messages = Arrays.asList(
    Message.builder()
        .setNotification(Notification.builder()
            .setTitle("Price drop")
            .setBody("5% off all electronics")
            .build())
        .setToken(registrationToken)
        .build(),
    // ...
    Message.builder()
        .setNotification(Notification.builder()
            .setTitle("Price drop")
            .setBody("2% off all books")
            .build())
        .setTopic("readers-club")
        .build()
);

BatchResponse response = FirebaseMessaging.getInstance().sendAll(messages);
// See the BatchResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " messages were sent successfully");

파이썬

# Create a list containing up to 500 messages.
messages = [
    messaging.Message(
        notification=messaging.Notification('Price drop', '5% off all electronics'),
        token=registration_token,
    ),
    # ...
    messaging.Message(
        notification=messaging.Notification('Price drop', '2% off all books'),
        topic='readers-club',
    ),
]

response = messaging.send_all(messages)
# See the BatchResponse reference documentation
# for the contents of response.
print('{0} messages were sent successfully'.format(response.success_count))

가다

// Create a list containing up to 500 messages.
messages := []*messaging.Message{
	{
		Notification: &messaging.Notification{
			Title: "Price drop",
			Body:  "5% off all electronics",
		},
		Token: registrationToken,
	},
	{
		Notification: &messaging.Notification{
			Title: "Price drop",
			Body:  "2% off all books",
		},
		Topic: "readers-club",
	},
}

br, err := client.SendAll(context.Background(), messages)
if err != nil {
	log.Fatalln(err)
}

// See the BatchResponse reference documentation
// for the contents of response.
fmt.Printf("%d messages were sent successfully\n", br.SuccessCount)

씨#

// Create a list containing up to 500 messages.
var messages = new List<Message>()
{
    new Message()
    {
        Notification = new Notification()
        {
            Title = "Price drop",
            Body = "5% off all electronics",
        },
        Token = registrationToken,
    },
    new Message()
    {
        Notification = new Notification()
        {
            Title = "Price drop",
            Body = "2% off all books",
        },
        Topic = "readers-club",
    },
};

var response = await FirebaseMessaging.DefaultInstance.SendAllAsync(messages);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");

쉬다

하위 요청 목록을 결합하여 HTTP 일괄 요청을 구성합니다.

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message to device 0!"
     }
  }
}

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "topic":"readers-club",
     "notification":{
       "title":"Price drop",
       "body":"2% off all books"
     }
  }
}

...

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "token":"cR1rjyj4_Kc:APA91bGusqbypSuMdsh7jSNrW4nzsM...",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message to device N!"
     }
  }
}
--subrequest_boundary--

반환된 BatchResponse 를 쿼리하여 FCM에 성공적으로 전달된 메시지 수를 확인할 수 있습니다. 또한 개별 메시지의 상태를 확인하는 데 사용할 수 있는 응답 목록을 표시합니다. 응답 순서는 입력 목록의 메시지 순서와 일치합니다.

직접 부팅 가능 메시지 보내기(Android만 해당)

HTTP v1 또는 레거시 HTTP API를 사용하여 직접 부팅 모드에서 장치에 메시지를 보낼 수 있습니다. 직접 부팅 모드에서 장치로 보내기 전에 클라이언트 장치가 직접 부팅 모드에서 FCM 메시지를 수신 할 수 있도록 하는 단계를 완료했는지 확인하십시오.

FCM v1 HTTP API를 사용하여 보내기

메시지 요청은 요청 본문의 AndroidConfig 옵션에 "direct_boot_ok" : true 키를 포함해야 합니다. 예를 들어:

https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
Content-Type:application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{
  "message":{
    "token" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
    "data": {
      "score": "5x1",
      "time": "15:10"
    },
    "android": {
      "direct_boot_ok": true,
    },
}

FCM 레거시 HTTP API를 사용하여 보내기

메시지 요청은 요청 본문의 최상위 수준에서 "direct_boot_ok" : true 키를 포함해야 합니다. 예를 들어:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  "direct_boot_ok" : true
}

요청 본문에서 이 키로 전송된 메시지는 현재 직접 부팅 모드(해당 모드가 아닐 때도)에 있는 기기의 앱에서 처리할 수 있습니다.

여러 플랫폼에서 메시지 사용자 정의

Firebase Admin SDK와 FCM v1 HTTP 프로토콜 모두 메시지 요청이 message 객체에서 사용 가능한 모든 필드를 설정할 수 있도록 합니다. 여기에는 다음이 포함됩니다.

  • 메시지를 수신하는 모든 앱 인스턴스에서 해석할 공통 필드 세트입니다.
  • AndroidConfigWebpushConfig 와 같은 플랫폼별 필드 세트는 지정된 플랫폼에서 실행되는 앱 인스턴스에 의해서만 해석됩니다.

플랫폼별 블록을 사용하면 수신 시 올바르게 처리되도록 다양한 플랫폼에 대한 메시지를 사용자 정의할 수 있는 유연성을 제공합니다. FCM 백엔드는 지정된 모든 매개변수를 고려하고 각 플랫폼에 대한 메시지를 사용자 정의합니다.

공통 필드를 사용하는 경우

다음과 같은 경우 공통 필드를 사용합니다.

  • Apple, Android 및 웹의 모든 플랫폼에서 앱 인스턴스 타겟팅
  • 주제에 메시지 보내기

플랫폼에 관계없이 모든 앱 인스턴스는 다음 공통 필드를 해석할 수 있습니다.

플랫폼별 필드를 사용하는 경우

다음을 수행하려는 경우 플랫폼별 필드를 사용합니다.

  • 특정 플랫폼에만 필드 보내기
  • 공통 필드 외에 플랫폼별 필드 보내기

특정 플랫폼에만 값을 보내려는 경우 공통 필드를 사용 하지 마십시오 . 플랫폼별 필드를 사용합니다. 예를 들어, 알림을 Apple 플랫폼과 웹에만 보내고 Android에는 보내지 않으려면 두 개의 개별 필드 집합을 사용해야 합니다. 하나는 Apple용이고 다른 하나는 웹용입니다.

특정 전송 옵션 이 있는 메시지를 보낼 때 플랫폼별 필드를 사용하여 설정합니다. 원하는 경우 플랫폼별로 다른 값을 지정할 수 있습니다. 그러나 기본적으로 플랫폼 간에 동일한 값을 설정하려는 경우에도 플랫폼별 필드를 사용해야 합니다. 이는 각 플랫폼에서 값을 약간 다르게 해석할 수 있기 때문입니다. 예를 들어 Android에서는 TTL(time-to-live)이 초 단위 만료 시간으로 설정되고 Apple에서는 만료 날짜 로 설정됩니다.

예: 색상 및 아이콘 옵션이 있는 알림 메시지

이 예제 보내기 요청은 모든 플랫폼에 공통 알림 제목과 콘텐츠를 보내지만 일부 플랫폼별 재정의를 Android 장치에도 보냅니다.

Android의 경우 요청은 Android 기기에 표시할 특수 아이콘과 색상을 설정합니다. AndroidNotification 에 대한 참조에서 언급했듯이 색상은 #rrggbb 형식으로 지정되며 이미지는 Android 앱에 로컬인 드로어블 아이콘 리소스여야 합니다.

다음은 사용자 장치에 대한 대략적인 시각 효과입니다.

사용자 정의 아이콘과 색상을 표시하는 두 장치의 간단한 그리기

노드.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: '`$FooCorp` up 1.43% on the day',
    body: 'FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  android: {
    notification: {
      icon: 'stock_ticker_update',
      color: '#7e55c3'
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

자바

Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setAndroidConfig(AndroidConfig.builder()
        .setTtl(3600 * 1000)
        .setNotification(AndroidNotification.builder()
            .setIcon("stock_ticker_update")
            .setColor("#f45342")
            .build())
        .build())
    .setApnsConfig(ApnsConfig.builder()
        .setAps(Aps.builder()
            .setBadge(42)
            .build())
        .build())
    .setTopic("industry-tech")
    .build();

파이썬

message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    android=messaging.AndroidConfig(
        ttl=datetime.timedelta(seconds=3600),
        priority='normal',
        notification=messaging.AndroidNotification(
            icon='stock_ticker_update',
            color='#f45342'
        ),
    ),
    apns=messaging.APNSConfig(
        payload=messaging.APNSPayload(
            aps=messaging.Aps(badge=42),
        ),
    ),
    topic='industry-tech',
)

가다

oneHour := time.Duration(1) * time.Hour
badge := 42
message := &messaging.Message{
	Notification: &messaging.Notification{
		Title: "$GOOG up 1.43% on the day",
		Body:  "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
	},
	Android: &messaging.AndroidConfig{
		TTL: &oneHour,
		Notification: &messaging.AndroidNotification{
			Icon:  "stock_ticker_update",
			Color: "#f45342",
		},
	},
	APNS: &messaging.APNSConfig{
		Payload: &messaging.APNSPayload{
			Aps: &messaging.Aps{
				Badge: &badge,
			},
		},
	},
	Topic: "industry-tech",
}

씨#

var message = new Message
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Android = new AndroidConfig()
    {
        TimeToLive = TimeSpan.FromHours(1),
        Notification = new AndroidNotification()
        {
            Icon = "stock_ticker_update",
            Color = "#f45342",
        },
    },
    Apns = new ApnsConfig()
    {
        Aps = new Aps()
        {
            Badge = 42,
        },
    },
    Topic = "industry-tech",
};

쉬다

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":"industry-tech",
     "notification":{
       "title":"`$FooCorp` up 1.43% on the day",
       "body":"FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day."
     },
     "android":{
       "notification":{
         "icon":"stock_ticker_update",
         "color":"#7e55c3"
       }
     }
   }
 }

메시지 본문의 플랫폼별 블록에서 사용 가능한 키에 대한 자세한 내용은 HTTP v1 참조 문서 를 참조하세요.

예: 맞춤 이미지가 포함된 알림 메시지

다음 예제 보내기 요청은 모든 플랫폼에 공통 알림 제목을 보내지만 이미지도 보냅니다. 다음은 사용자 장치에 대한 대략적인 시각 효과입니다.

표시 알림에서 이미지의 간단한 그리기

노드.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: 'Sparky says hello!'
  },
  android: {
    notification: {
      imageUrl: 'https://foo.bar.pizza-monster.png'
    }
  },
  apns: {
    payload: {
      aps: {
        'mutable-content': 1
      }
    },
    fcm_options: {
      image: 'https://foo.bar.pizza-monster.png'
    }
  },
  webpush: {
    headers: {
      image: 'https://foo.bar.pizza-monster.png'
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

쉬다

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":"industry-tech",
     "notification":{
       "title":"Sparky says hello!",
     },
     "android":{
       "notification":{
         "image":"https://foo.bar/pizza-monster.png"
       }
     },
     "apns":{
       "payload":{
         "aps":{
           "mutable-content":1
         }
       },
       "fcm_options": {
           "image":"https://foo.bar/pizza-monster.png"
       }
     },
     "webpush":{
       "headers":{
         "image":"https://foo.bar/pizza-monster.png"
       }
     }
   }
 }

메시지 본문의 플랫폼별 블록에서 사용 가능한 키에 대한 자세한 내용은 HTTP v1 참조 문서 를 참조하세요.

예: 연결된 클릭 동작이 있는 알림 메시지

다음 예제 보내기 요청은 모든 플랫폼에 공통 알림 제목을 보내지만 알림과 상호 작용하는 사용자에 대한 응답으로 앱이 수행할 작업도 보냅니다. 다음은 사용자 장치에 대한 대략적인 시각 효과입니다.

웹 페이지를 여는 사용자 탭의 간단한 그림

노드.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: 'Breaking News....'
  },
  android: {
    notification: {
      clickAction: 'news_intent'
    }
  },
  apns: {
    payload: {
      aps: {
        'category': 'INVITE_CATEGORY'
      }
    }
  },
  webpush: {
    fcmOptions: {
      link: 'breakingnews.html'
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

쉬다

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":"industry-tech",
     "notification":{
       "title":"Breaking News...",
     },
     "android":{
       "notification":{
         "click_action":"news_intent"
       }
     },
     "apns":{
       "payload":{
         "aps":{
           "category" : "INVITE_CATEGORY"
         }
       },
     },
     "webpush":{
       "fcm_options":{
         "link":"breakingnews.html"
       }
     }
   }
 }

메시지 본문의 플랫폼별 블록에서 사용 가능한 키에 대한 자세한 내용은 HTTP v1 참조 문서 를 참조하세요.

예: 현지화 옵션이 있는 알림 메시지

다음 예제 보내기 요청은 클라이언트가 현지화된 메시지를 표시하도록 현지화 옵션을 보냅니다. 다음은 사용자 장치에 대한 대략적인 시각 효과입니다.

영어와 스페인어로 텍스트를 표시하는 두 장치의 간단한 그리기

노드.js

var topicName = 'industry-tech';

var message = {
  android: {
    ttl: 3600000,
    notification: {
      bodyLocKey: 'STOCK_NOTIFICATION_BODY',
      bodyLocArgs: ['FooCorp', '11.80', '835.67', '1.43']
    }
  },
  apns: {
    payload: {
      aps: {
        alert: {
          locKey: 'STOCK_NOTIFICATION_BODY',
          locArgs: ['FooCorp', '11.80', '835.67', '1.43']
        }
      }
    }
  },
  topic: topicName,
};

getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

쉬다

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":"Tech",
             "android":{
               "ttl":"3600s",
               "notification":{
                 "body_loc_key": "STOCK_NOTIFICATION_BODY",
                 "body_loc_args":  ["FooCorp", "11.80", "835.67", "1.43"],
               },
             },
             "apns":{
               "payload":{
                 "aps":{
                   "alert" : {
                     "loc-key": "STOCK_NOTIFICATION_BODY",
                     "loc-args":  ["FooCorp", "11.80", "835.67", "1.43"],
                    },
                 },
               },
             },
  },
}'

메시지 본문의 플랫폼별 블록에서 사용 가능한 키에 대한 자세한 내용은 HTTP v1 참조 문서 를 참조하세요.

관리자 오류 코드

다음 표에는 권장되는 해결 단계를 포함하여 Firebase Admin FCM API 오류 코드와 설명이 나와 있습니다.

에러 코드 설명 및 해결 단계
messaging/invalid-argument FCM 메서드에 잘못된 인수가 제공되었습니다. 오류 메시지에는 추가 정보가 포함되어야 합니다.
messaging/invalid-recipient 의도한 메시지 수신자가 잘못되었습니다. 오류 메시지에는 추가 정보가 포함되어야 합니다.
messaging/invalid-payload 잘못된 메시지 페이로드 개체가 제공되었습니다. 오류 메시지에는 추가 정보가 포함되어야 합니다.
messaging/invalid-data-payload-key 데이터 메시지 페이로드에 잘못된 키가 있습니다. 제한된 키에 대해서는 DataMessagePayload 에 대한 참조 문서를 참조하십시오.
messaging/payload-size-limit-exceeded 제공된 메시지 페이로드가 FCM 크기 제한을 초과합니다. 대부분의 메시지에 대한 제한은 4096바이트입니다. 주제로 전송된 메시지의 경우 제한은 2048바이트입니다. 총 페이로드 크기에는 키와 값이 모두 포함됩니다.
messaging/invalid-options 잘못된 메시지 옵션 개체가 제공되었습니다. 오류 메시지에는 추가 정보가 포함되어야 합니다.
messaging/invalid-registration-token 잘못된 등록 토큰이 제공되었습니다. 클라이언트 앱이 FCM에 등록할 때 받는 등록 토큰과 일치하는지 확인하세요. 자르거나 추가 문자를 추가하지 마십시오.
messaging/registration-token-not-registered 제공된 등록 토큰이 등록되지 않았습니다. 이전에 유효한 등록 토큰은 다음과 같은 다양한 이유로 등록이 취소될 수 있습니다.
  • 클라이언트 앱이 FCM에서 자체적으로 등록 취소되었습니다.
  • 클라이언트 앱이 자동으로 등록 취소되었습니다. 이는 사용자가 애플리케이션을 제거하거나 Apple 플랫폼에서 APN 피드백 서비스가 APN 토큰을 유효하지 않은 것으로 보고한 경우에 발생할 수 있습니다.
  • 등록 토큰이 만료되었습니다. 예를 들어 Google은 등록 토큰을 새로 고치기로 결정하거나 APN 토큰이 Apple 장치에 대해 만료되었을 수 있습니다.
  • 클라이언트 앱이 업데이트되었지만 새 버전이 메시지를 수신하도록 구성되지 않았습니다.
이러한 모든 경우에 이 등록 토큰을 제거하고 메시지 전송에 사용을 중지하십시오.
messaging/invalid-package-name 패키지 이름이 제공된 restrictedPackageName 옵션과 일치하지 않는 등록 토큰으로 메시지가 전달되었습니다.
messaging/message-rate-exceeded 특정 대상에 대한 메시지 비율이 너무 높습니다. 이 장치 또는 주제로 전송되는 메시지 수를 줄이고 이 대상으로 전송을 즉시 재시도하지 마십시오.
messaging/device-message-rate-exceeded 특정 장치에 대한 메시지 비율이 너무 높습니다. 이 장치로 보내는 메시지 수를 줄이고 즉시 이 장치로 다시 보내지 마십시오.
messaging/topics-message-rate-exceeded 특정 주제에 대한 구독자에게 보내는 메시지 비율이 너무 높습니다. 이 주제에 대해 전송된 메시지 수를 줄이고 이 주제에 대해 즉시 전송을 다시 시도하지 마십시오.
messaging/too-many-topics 등록 토큰이 최대 주제 수를 구독했으며 더 이상 구독할 수 없습니다.
messaging/invalid-apns-credentials 필수 APN SSL 인증서가 업로드되지 않았거나 만료되어 Apple 장치를 대상으로 하는 메시지를 보낼 수 없습니다. 개발 및 생산 인증서의 유효성을 확인하십시오.
messaging/mismatched-credential 이 SDK를 인증하는 데 사용된 자격 증명에는 제공된 등록 토큰에 해당하는 장치에 메시지를 보낼 수 있는 권한이 없습니다. 자격 증명과 등록 토큰이 모두 동일한 Firebase 프로젝트에 속하는지 확인합니다. Firebase Admin SDK를 인증하는 방법에 대한 문서는 앱에 Firebase 추가를 참조하세요 .
messaging/authentication-error SDK가 FCM 서버에 인증할 수 없습니다. FCM 메시지를 보낼 수 있는 적절한 권한이 있는 자격 증명으로 Firebase Admin SDK를 인증해야 합니다. Firebase Admin SDK를 인증하는 방법에 대한 문서는 앱에 Firebase 추가를 참조하세요 .
messaging/server-unavailable FCM 서버가 요청을 제시간에 처리할 수 없습니다. 동일한 요청을 다시 시도해야 하지만 다음을 수행해야 합니다.
  • FCM 연결 서버의 응답에 포함된 경우 Retry-After 헤더를 준수합니다.
  • 재시도 메커니즘에서 지수 백오프를 구현하십시오. 예를 들어, 첫 번째 재시도 전에 1초를 기다렸다면 다음 재시도 전에 최소 2초를 기다린 후 4초를 기다리십시오. 여러 메시지를 보내는 경우 모든 메시지에 대해 동시에 새 요청을 발행하지 않도록 추가 임의의 양만큼 각 메시지를 독립적으로 지연하십시오.
문제를 일으키는 발신자는 블랙리스트에 올라갈 위험이 있습니다.
messaging/internal-error FCM 서버에서 요청을 처리하는 동안 오류가 발생했습니다. 위의 messaging/server-unavailable 행에 나열된 요구 사항에 따라 동일한 요청을 다시 시도할 수 있습니다. 오류가 지속되면 버그 보고서 지원 채널에 문제를 보고하세요.
messaging/unknown-error 알 수 없는 서버 오류가 반환되었습니다. 자세한 내용은 오류 메시지의 원시 서버 응답을 참조하십시오. 이 오류가 발생하면 전체 오류 메시지를 버그 보고서 지원 채널에 보고하세요.

레거시 앱 서버 프로토콜을 사용하여 메시지 보내기

레거시 프로토콜을 사용하려면 이 섹션에 표시된 대로 메시지 요청을 작성하십시오. HTTP를 통해 여러 플랫폼에 보내는 경우 v1 프로토콜이 메시지 요청을 단순화할 수 있습니다.

특정 장치에 메시지 보내기

특정 장치에 메시지를 보내려면 to 키를 특정 앱 인스턴스의 등록 토큰으로 설정하십시오. 등록 토큰에 대한 자세한 내용은 플랫폼의 클라이언트 설정 정보를 참조하십시오.

HTTP POST 요청

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

HTTP 응답

{ "multicast_id": 108,
  "success": 1,
  "failure": 0,
  "results": [
    { "message_id": "1:08" }
  ]
}

XMPP 메시지

<message id="">
  <gcm xmlns="google:mobile:data">
    { "data": {
      "score": "5x1",
      "time": "15:10"
    },
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
  }
  </gcm>
</message>

XMPP 응답

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "from":"REGID",
      "message_id":"m-1366082849205"
      "message_type":"ack"
  }
  </gcm>
</message>

XMPP 연결 서버는 응답을 위한 몇 가지 다른 옵션을 제공합니다. 서버 응답 형식 을 참조하십시오.

클라이언트 앱에 다운스트림 메시지를 보낼 때 사용할 수 있는 메시지 옵션의 전체 목록은 선택한 연결 서버 프로토콜, HTTP 또는 XMPP 에 대한 참조 정보를 참조하세요.

주제에 메시지 보내기

Firebase 클라우드 메시징 주제에 메시지를 보내는 것은 개별 기기나 사용자 그룹에 메시지를 보내는 것과 매우 유사합니다. 앱 서버는 /topics/yourTopic 과 같은 값을 사용하여 to 키를 설정합니다. 개발자는 정규식과 일치하는 주제 이름을 선택할 수 있습니다. "/topics/[a-zA-Z0-9-_.~%]+" .

여러 주제의 조합으로 보내려면 앱 서버에서 대상 주제를 지정하는 부울 조건으로 condition 키( to 키 대신)를 설정해야 합니다. 예를 들어, TopicATopicB 또는 TopicC 를 구독한 장치에 메시지를 보내려면 다음을 수행합니다.

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

FCM은 먼저 괄호 안의 조건을 평가한 다음 왼쪽에서 오른쪽으로 표현식을 평가합니다. 위 식에서 단일 주제를 구독한 사용자는 메시지를 받지 않습니다. 마찬가지로, TopicA를 구독하지 않은 사용자는 메시지를 수신하지 않습니다. 다음 조합은 수신합니다.

  • 주제A 및 주제B
  • 주제A 및 주제C

조건식에는 최대 5개의 주제를 포함할 수 있으며 괄호가 지원됩니다. 지원되는 연산자: && , || .

주제 HTTP POST 요청

단일 주제로 보내기:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA


"개" 또는 "고양이" 주제를 구독하는 장치로 보내기:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA


주제 HTTP 응답

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

주제 XMPP 메시지

단일 주제로 보내기:

<message id="">
  <gcm xmlns="google:mobile:data">


  </gcm>
</message>

"개" 또는 "고양이" 주제를 구독하는 장치로 보내기:

<message id="">
  <gcm xmlns="google:mobile:data">


  </gcm>
</message>

주제 XMPP 응답

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

FCM 서버가 주제 전송 요청에 대한 성공 또는 실패 응답을 반환하기까지 최대 30초의 지연이 예상됩니다. 그에 따라 요청에서 앱 서버의 시간 초과 값을 설정해야 합니다.

장치 그룹에 메시지 보내기

장치 그룹에 메시지를 보내는 것은 개별 장치에 메시지를 보내는 것과 매우 유사합니다. to 매개변수를 장치 그룹에 대한 고유한 알림 키로 설정하십시오. 페이로드 지원에 대한 자세한 내용은 메시지 유형 을 참조하세요. 이 페이지의 예는 레거시 HTTP 및 XMPP 프로토콜의 장치 그룹에 데이터 메시지를 보내는 방법을 보여줍니다.

장치 그룹 HTTP POST 요청

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "aUniqueKey",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!",
   }
}

장치 그룹 HTTP 응답

다음은 "성공"의 예입니다. notification_key 에는 2개의 등록 토큰이 연결되어 있고 메시지가 둘 다 성공적으로 전송되었습니다.

{
  "success": 2,
  "failure": 0
}

다음은 "부분적 성공"의 예입니다. notification_key 에는 3개의 등록 토큰이 연결되어 있습니다. 메시지가 등록 토큰 중 1개에만 성공적으로 전송되었습니다. 응답 메시지는 메시지 수신에 실패한 등록 토큰( registration_ids )을 나열합니다.

{
  "success":1,
  "failure":2,
  "failed_registration_ids":[
     "regId1",
     "regId2"
  ]
}

메시지가 notification_key 와 연결된 하나 이상의 등록 토큰으로 전달되지 않으면 앱 서버는 재시도 사이에 백오프를 사용하여 재시도해야 합니다.

서버가 구성원이 없는 장치 그룹에 메시지를 보내려고 하면 응답은 다음과 같으며 성공은 0이고 실패는 0입니다.

{
  "success": 0,
  "failure": 0
}

장치 그룹 XMPP 메시지

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to": "aUniqueKey",
      "message_id": "m-1366082849205" ,
      "data": {
          "hello":"This is a Firebase Cloud Messaging Device Group Message!"
      }
  }
  </gcm>
</message>

장치 그룹 XMPP 응답

메시지가 그룹의 장치 중 하나로 성공적으로 전송되면 XMPP 연결 서버는 ACK로 응답합니다. 그룹의 모든 장치로 보내는 모든 메시지가 실패하면 XMPP 연결 서버는 NACK으로 응답합니다.

다음은 "성공"의 예입니다. notification_key 에는 3개의 등록 토큰이 연결되어 있고 메시지가 모두 성공적으로 전송되었습니다.

{
  "from": "aUniqueKey",
  "message_type": "ack",
  "success": 3,
  "failure": 0,
  "message_id": "m-1366082849205"
}

다음은 "부분적 성공"의 예입니다. notification_key 에는 3개의 등록 토큰이 연결되어 있습니다. 메시지가 등록 토큰 중 1개에만 성공적으로 전송되었습니다. 응답 메시지에는 메시지 수신에 실패한 등록 토큰이 나열됩니다.

{
  "from": "aUniqueKey",
  "message_type": "ack",
  "success":1,
  "failure":2,
  "failed_registration_ids":[
     "regId1",
     "regId2"
  ]
}

FCM 연결 서버가 그룹의 모든 장치에 전달하지 못하는 경우. 앱 서버는 nack 응답을 받습니다.

메시지 옵션의 전체 목록은 선택한 연결 서버 프로토콜, HTTP 또는 XMPP 에 대한 참조 정보를 참조하십시오.

Firebase Admin SDK 기존 전송 방법

Firebase Admin Node.js SDK는 기존 FCM 서버 API 를 기반으로 하는 (FCM) 메시지 전송 방법을 지원합니다. 이러한 메서드는 send() 메서드와 비교하여 다른 인수를 허용합니다. 가능한 한 send() 메서드를 사용해야 하며 개별 장치 또는 장치 그룹에 메시지를 보낼 때 이 페이지에 설명된 메서드만 사용해야 합니다.

개별 장치로 보내기

sendToDevice() 메서드에 등록 토큰을 전달하여 해당 장치에 메시지를 보낼 수 있습니다.

노드.js

// This registration token comes from the client FCM SDKs.
const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// See the "Defining the message payload" section below for details
// on how to define a message payload.
const payload = {
  data: {
    score: '850',
    time: '2:45'
  }
};

// Send a message to the device corresponding to the provided
// registration token.
getMessaging().sendToDevice(registrationToken, payload)
  .then((response) => {
    // See the MessagingDevicesResponse reference documentation for
    // the contents of response.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

sendToDevice() 메서드는 단일 등록 토큰 대신 등록 토큰 배열을 전달하여 멀티캐스트 메시지(즉, 여러 장치에 메시지)를 보낼 수도 있습니다.

노드.js

// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...',
  // ...
  'ecupwIfBy1w:APA91bFtuMY7MktgxA3Au_Qx7cKqnf...'
];

// See the "Defining the message payload" section below for details
// on how to define a message payload.
const payload = {
  data: {
    score: '850',
    time: '2:45'
  }
};

// Send a message to the devices corresponding to the provided
// registration tokens.
getMessaging().sendToDevice(registrationTokens, payload)
  .then((response) => {
    // See the MessagingDevicesResponse reference documentation for
    // the contents of response.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

sendToDevice() 메서드는 FCM의 응답이 포함된 MessagingDevicesResponse 개체로 확인된 약속을 반환합니다. 단일 등록 토큰 또는 등록 토큰 배열을 전달할 때 반환 유형은 동일한 형식을 갖습니다.

인증 오류 또는 속도 제한과 같은 일부 경우로 인해 전체 메시지가 처리되지 않습니다. 이러한 경우 sendToDevice() 에 의해 반환된 약속은 오류와 함께 거부됩니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 Admin FCM API 오류 를 참조하세요.

장치 그룹으로 보내기

장치 그룹 메시징을 사용하면 단일 그룹에 여러 장치를 추가할 수 있습니다. 이것은 토픽 메시징과 유사하지만 그룹 구성원이 서버에서만 관리되도록 하는 인증을 포함합니다. 예를 들어 다른 전화 모델에 다른 메시지를 보내려는 경우 서버에서 적절한 그룹에 등록을 추가/제거하고 각 그룹에 적절한 메시지를 보낼 수 있습니다. 장치 그룹 메시징은 애플리케이션 내에서 직접 관리하는 대신 서버에서 장치 그룹을 관리한다는 점에서 주제 메시징과 다릅니다.

앱 서버에서 레거시 XMPP 또는 HTTP 프로토콜을 통해 장치 그룹 메시징을 사용할 수 있습니다. Node.js용 Firebase Admin SDK 의 이전 버전은 기존 프로토콜을 기반으로 하며 기기 그룹 메시징 기능도 제공합니다. 알림 키에 허용되는 최대 구성원 수는 20명입니다.

앱 서버 또는 Android 클라이언트를 통해 장치 그룹을 만들고 알림 키를 생성할 수 있습니다. 자세한 내용은 장치 그룹 관리 를 참조하십시오.

sendToDeviceGroup() 메서드를 사용하면 해당 장치 그룹에 대한 알림 키를 지정하여 장치 그룹에 메시지를 보낼 수 있습니다.

노드.js

// See the "Managing device groups" link above on how to generate a
// notification key.
const notificationKey = 'some-notification-key';

// See the "Defining the message payload" section below for details
// on how to define a message payload.
const payload = {
  data: {
    score: '850',
    time: '2:45'
  }
};

// Send a message to the device group corresponding to the provided
// notification key.
getMessaging().sendToDeviceGroup(notificationKey, payload)
  .then((response) => {
    // See the MessagingDeviceGroupResponse reference documentation for
    // the contents of response.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

sendToDeviceGroup() 메서드는 FCM의 응답이 포함된 MessagingDevicesResponse 개체로 확인된 약속을 반환합니다.

인증 오류 또는 속도 제한과 같은 일부 경우로 인해 전체 메시지가 처리되지 않습니다. 이러한 경우 sendToDeviceGroup() 이 반환한 약속은 오류와 함께 거부됩니다. 설명 및 해결 단계를 포함한 전체 오류 코드 목록은 Admin FCM API 오류 를 참조하세요.

메시지 페이로드 정의

FCM 레거시 프로토콜을 기반으로 하는 위의 방법은 메시지 페이로드를 두 번째 인수로 수락하고 알림 및 데이터 메시지를 모두 지원합니다. data 및/또는 notification 키로 개체를 만들어 하나 또는 두 가지 메시지 유형을 모두 지정할 수 있습니다. 예를 들어 다음은 다양한 유형의 메시지 페이로드를 정의하는 방법입니다.

알림 메시지

const payload = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  }
};

데이터 메시지

const payload = {
  data: {
    score: '850',
    time: '2:45'
  }
};

결합된 메시지

const payload = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  data: {
    stock: 'GOOG',
    open: '829.62',
    close: '635.67'
  }
};

알림 메시지 페이로드에는 유효한 속성의 미리 정의된 하위 집합이 있으며 대상으로 하는 모바일 운영 체제에 따라 약간 다릅니다. 전체 목록은 NotificationMessagePayload 에 대한 참조 문서를 참조하세요.

데이터 메시지 페이로드는 모든 값이 문자열이어야 한다는 사실을 포함하여 몇 가지 제한이 있는 사용자 지정 키-값 쌍으로 구성됩니다. 전체 제한 목록은 DataMessagePayload 에 대한 참조 문서를 참조하세요.

메시지 옵션 정의

FCM 레거시 프로토콜을 기반으로 하는 위의 방법은 메시지에 대한 일부 옵션을 지정하는 선택적 세 번째 인수를 허용합니다. 예를 들어 다음 예는 24시간 후에 만료되는 높은 우선 순위 메시지를 장치에 보냅니다.

노드.js

// This registration token comes from the client FCM SDKs.
const registrationToken = 'bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...';

// See the "Defining the message payload" section above for details
// on how to define a message payload.
const payload = {
  notification: {
    title: 'Urgent action needed!',
    body: 'Urgent action is needed to prevent your account from being disabled!'
  }
};

// Set the message as high priority and have it expire after 24 hours.
const options = {
  priority: 'high',
  timeToLive: 60 * 60 * 24
};

// Send a message to the device corresponding to the provided
// registration token with the provided options.
getMessaging().sendToDevice(registrationToken, payload, options)
  .then((response) => {
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

사용 가능한 옵션의 전체 목록은 MessagingOptions 에 대한 참조 문서를 참조하세요.