Xây dựng máy chủ ứng dụng gửi yêu cầu

Bằng cách sử dụng SDK quản trị Firebase hoặc giao thức máy chủ ứng dụng FCM, bạn có thể tạo yêu cầu tin nhắn và gửi chúng đến các loại mục tiêu sau:

  • Tên chủ đề
  • Tình trạng
  • Mã thông báo đăng ký thiết bị
  • Tên nhóm thiết bị (chỉ giao thức)

Bạn có thể gửi tin nhắn có tải trọng thông báo được tạo thành từ các trường được xác định trước, tải trọng dữ liệu của các trường do người dùng xác định của riêng bạn hoặc tin nhắn chứa cả hai loại tải trọng. Xem Các loại tin nhắn để biết thêm thông tin.

Các ví dụ trong trang này cho thấy cách gửi tin nhắn thông báo bằng SDK quản trị Firebase (có hỗ trợ cho Node , Java , Python , C#Go ) và giao thức HTTP v1 . Ngoài ra còn có hướng dẫn gửi tin nhắn qua các giao thức HTTP và XMPP cũ không được dùng nữa .

Gửi tin nhắn đến các thiết bị cụ thể

Để gửi đến một thiết bị cụ thể, hãy chuyển mã thông báo đăng ký của thiết bị như được hiển thị. Xem thông tin thiết lập ứng dụng khách cho nền tảng của bạn để tìm hiểu thêm về mã thông báo đăng ký.

Node.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);
  });

Java

// 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);

Python

# 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)

Đi

// 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)

C#

// 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);

NGHỈ NGƠI

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"
      }
   }
}

lệnh 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

Khi thành công, mỗi phương thức gửi sẽ trả về một ID tin nhắn. SDK quản trị Firebase trả về chuỗi ID ở định dạng projects/{project_id}/messages/{message_id} . Phản hồi của giao thức HTTP là một khóa JSON duy nhất:

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

Gửi tin nhắn tới nhiều thiết bị

API FCM quản trị cho phép bạn gửi tin nhắn đa hướng đến danh sách mã thông báo đăng ký thiết bị. Bạn có thể chỉ định tối đa 500 mã thông báo đăng ký thiết bị cho mỗi lệnh gọi.

Node.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');
  });

Java

// 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");

Python

# 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))

Đi

// 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)

C#

// 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.SendEachForMulticastAsync(message);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");

Giá trị trả về là danh sách các token tương ứng với thứ tự của các token đầu vào. Điều này hữu ích khi bạn muốn kiểm tra xem mã thông báo nào dẫn đến lỗi.

Node.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);
    }
  });

Java

// 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);
}

Python

# 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))

Đi

// 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)
}

C#

// 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.SendEachForMulticastAsync(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}");
}

Gửi tin nhắn đến chủ đề

Sau khi bạn đã tạo một chủ đề, bằng cách đăng ký các phiên bản ứng dụng khách cho chủ đề ở phía máy khách hoặc thông qua API máy chủ , bạn có thể gửi tin nhắn đến chủ đề. Nếu đây là lần đầu tiên bạn xây dựng yêu cầu gửi FCM, hãy xem hướng dẫn về môi trường máy chủ và FCM của bạn để biết thông tin cơ bản và thiết lập quan trọng.

Trong logic gửi của bạn ở phần phụ trợ, hãy chỉ định tên chủ đề mong muốn như được hiển thị:

Node.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);
  });

Java

// 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);

Python

# 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)

Đi

// 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)

C#

// 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);

NGHỈ NGƠI

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"
      }
   }
}

lệnh 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

Để gửi tin nhắn đến một tổ hợp các chủ đề, hãy chỉ định một điều kiện , đây là biểu thức boolean chỉ định các chủ đề đích. Ví dụ: điều kiện sau sẽ gửi tin nhắn đến các thiết bị đã đăng ký TopicATopicB hoặc TopicC :

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

Trước tiên FCM đánh giá mọi điều kiện trong ngoặc đơn, sau đó đánh giá biểu thức từ trái sang phải. Trong biểu thức trên, người dùng đăng ký bất kỳ chủ đề nào sẽ không nhận được tin nhắn. Tương tự, người dùng không đăng ký TopicA sẽ không nhận được tin nhắn. Những kết hợp này nhận được nó:

  • TopicATopicB
  • TopicATopicC

Bạn có thể bao gồm tối đa năm chủ đề trong biểu thức điều kiện của mình.

Để gửi đến một điều kiện:

Node.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);
  });

Java

// 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);

Python

# 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)

Đi

// 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)

C#

// 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);

NGHỈ NGƠI

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",
    }
  }
}

lệnh 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

Gửi tin nhắn đến các nhóm thiết bị

Để gửi tin nhắn đến các nhóm thiết bị, hãy sử dụng API HTTP v1. Nếu bạn hiện đang gửi tới các nhóm thiết bị bằng cách sử dụng API gửi cũ không được dùng nữa cho HTTP hoặc XMPP hoặc bất kỳ phiên bản cũ hơn nào của SDK quản trị Firebase dành cho Node.js dựa trên các giao thức cũ, chúng tôi thực sự khuyên bạn nên di chuyển sang HTTP v1 API trong cơ hội sớm nhất. Các API gửi cũ sẽ bị vô hiệu hóa và xóa vào tháng 6 năm 2024.

Gửi tin nhắn đến một nhóm thiết bị rất giống với việc gửi tin nhắn đến một thiết bị riêng lẻ, sử dụng cùng một phương pháp để ủy quyền gửi yêu cầu . Đặt trường token thành khóa thông báo nhóm:

NGHỈ NGƠI

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":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ",
      "data":{
        "hello": "This is a Firebase Cloud Messaging device group message!"
      }
   }
}

lệnh cURL

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message":{
   "data":{
     "hello": "This is a Firebase Cloud Messaging device group message!"
   },
   "token":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
}}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send

Gửi một loạt tin nhắn

SDK quản trị hỗ trợ gửi tin nhắn theo đợt. Bạn có thể nhóm tối đa 500 tin nhắn thành một đợt và gửi tất cả chúng trong một lệnh gọi API, với sự cải thiện hiệu suất đáng kể so với việc gửi các yêu cầu HTTP riêng biệt cho từng tin nhắn.

Tính năng này có thể được sử dụng để xây dựng một bộ tin nhắn tùy chỉnh và gửi chúng đến những người nhận khác nhau, bao gồm các chủ đề hoặc mã thông báo đăng ký thiết bị cụ thể. Ví dụ: sử dụng tính năng này khi bạn cần gửi đồng thời tin nhắn đến các đối tượng khác nhau với các chi tiết hơi khác nhau trong nội dung thư.

Node.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');
  });

Java

// 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");

Python

# 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))

Đi

// 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)

C#

// 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.SendEachAsync(messages);
// See the BatchResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} messages were sent successfully");

Gửi tin nhắn hỗ trợ khởi động trực tiếp (chỉ dành cho Android)

Bạn có thể gửi tin nhắn đến các thiết bị ở chế độ khởi động trực tiếp bằng cách sử dụng HTTP v1 hoặc API HTTP cũ. Trước khi gửi tới các thiết bị ở chế độ khởi động trực tiếp, hãy đảm bảo bạn đã hoàn thành các bước để cho phép thiết bị khách nhận tin nhắn FCM ở chế độ khởi động trực tiếp .

Gửi bằng API HTTP FCM v1

Yêu cầu tin nhắn phải bao gồm khóa "direct_boot_ok" : true trong tùy chọn AndroidConfig của nội dung yêu cầu. Ví dụ:

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,
    },
}

Gửi bằng API HTTP kế thừa FCM

Yêu cầu tin nhắn phải bao gồm khóa "direct_boot_ok" : true ở cấp cao nhất của nội dung yêu cầu. Ví dụ:

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
}

Các tin nhắn được gửi bằng khóa này trong nội dung yêu cầu có thể được xử lý bởi các ứng dụng trên thiết bị hiện ở chế độ khởi động trực tiếp (và cả khi không ở chế độ đó).

Tùy chỉnh tin nhắn trên các nền tảng

SDK quản trị Firebase và giao thức HTTP FCM v1 đều cho phép các yêu cầu tin nhắn của bạn đặt tất cả các trường có sẵn trong đối tượng message . Điêu nay bao gôm:

  • một tập hợp các trường chung được diễn giải bởi tất cả các phiên bản ứng dụng nhận được thông báo.
  • tập hợp các trường dành riêng cho nền tảng, chẳng hạn như AndroidConfigWebpushConfig , chỉ được diễn giải bởi các phiên bản ứng dụng chạy trên nền tảng được chỉ định.

Khối dành riêng cho nền tảng giúp bạn linh hoạt tùy chỉnh tin nhắn cho các nền tảng khác nhau để đảm bảo rằng chúng được xử lý chính xác khi nhận được. Phần phụ trợ FCM sẽ tính đến tất cả các tham số được chỉ định và tùy chỉnh thông báo cho từng nền tảng.

Khi nào nên sử dụng các trường chung

Sử dụng các trường chung khi bạn:

  • Nhắm mục tiêu các phiên bản ứng dụng trên tất cả các nền tảng - Apple, Android và web
  • Gửi tin nhắn theo chủ đề

Tất cả các phiên bản ứng dụng, bất kể nền tảng, đều có thể diễn giải các trường phổ biến sau:

Khi nào nên sử dụng các trường dành riêng cho nền tảng

Sử dụng các trường dành riêng cho nền tảng khi bạn muốn:

  • Chỉ gửi các trường đến các nền tảng cụ thể
  • Gửi các trường dành riêng cho nền tảng bên cạnh các trường chung

Bất cứ khi nào bạn chỉ muốn gửi giá trị đến các nền tảng cụ thể, đừng sử dụng các trường chung; sử dụng các trường dành riêng cho nền tảng. Ví dụ: để chỉ gửi thông báo tới nền tảng và web của Apple chứ không phải tới Android, bạn phải sử dụng hai nhóm trường riêng biệt, một cho Apple và một cho web.

Khi bạn gửi tin nhắn với các tùy chọn gửi cụ thể , hãy sử dụng các trường dành riêng cho nền tảng để đặt chúng. Bạn có thể chỉ định các giá trị khác nhau cho mỗi nền tảng nếu muốn. Tuy nhiên, ngay cả khi bạn muốn đặt cùng một giá trị trên các nền tảng, bạn phải sử dụng các trường dành riêng cho nền tảng. Điều này là do mỗi nền tảng có thể diễn giải giá trị hơi khác nhau—ví dụ: thời gian tồn tại được đặt trên Android là thời gian hết hạn tính bằng giây, trong khi trên Apple, thời gian tồn tại được đặt là ngày hết hạn .

Ví dụ: tin nhắn thông báo có tùy chọn màu sắc và biểu tượng

Yêu cầu gửi ví dụ này sẽ gửi tiêu đề và nội dung thông báo chung tới tất cả các nền tảng, nhưng nó cũng gửi một số thông tin ghi đè dành riêng cho nền tảng tới các thiết bị Android.

Đối với Android, yêu cầu đặt biểu tượng và màu sắc đặc biệt để hiển thị trên thiết bị Android. Như đã lưu ý trong tài liệu tham khảo dành cho AndroidNotification , màu được chỉ định ở định dạng #rrggbb và hình ảnh phải là tài nguyên biểu tượng có thể vẽ cục bộ cho ứng dụng Android.

Dưới đây là hiệu ứng hình ảnh gần đúng trên thiết bị của người dùng:

Bản vẽ đơn giản về hai thiết bị, trong đó một thiết bị hiển thị biểu tượng và màu sắc tùy chỉnh

Node.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);
  });

Java

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();

Python

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',
)

Đi

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",
}

C#

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",
};

NGHỈ NGƠI

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"
       }
     }
   }
 }

Xem tài liệu tham khảo HTTP v1 để biết chi tiết đầy đủ về các khóa có sẵn trong các khối dành riêng cho nền tảng trong nội dung thư.

Ví dụ: tin nhắn thông báo có hình ảnh tùy chỉnh

Yêu cầu gửi ví dụ sau sẽ gửi tiêu đề thông báo chung tới tất cả các nền tảng, nhưng nó cũng gửi một hình ảnh. Dưới đây là hiệu ứng hình ảnh gần đúng trên thiết bị của người dùng:

Vẽ hình ảnh đơn giản trong thông báo hiển thị

Node.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);
  });

NGHỈ NGƠI

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"
       }
     }
   }
 }

Xem tài liệu tham khảo HTTP v1 để biết chi tiết đầy đủ về các khóa có sẵn trong các khối dành riêng cho nền tảng trong nội dung thư.

Ví dụ: tin nhắn thông báo có hành động nhấp chuột liên quan

Yêu cầu gửi ví dụ sau sẽ gửi tiêu đề thông báo chung tới tất cả các nền tảng, nhưng nó cũng gửi một hành động để ứng dụng thực hiện nhằm phản hồi người dùng tương tác với thông báo. Dưới đây là hiệu ứng hình ảnh gần đúng trên thiết bị của người dùng:

Hình vẽ đơn giản thao tác nhấn của người dùng để mở một trang web

Node.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);
  });

NGHỈ NGƠI

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"
       }
     }
   }
 }

Xem tài liệu tham khảo HTTP v1 để biết chi tiết đầy đủ về các khóa có sẵn trong các khối dành riêng cho nền tảng trong nội dung thư.

Ví dụ: tin nhắn thông báo với các tùy chọn bản địa hóa

Ví dụ sau đây gửi yêu cầu gửi các tùy chọn bản địa hóa cho máy khách để hiển thị các thông báo đã bản địa hóa. Dưới đây là hiệu ứng hình ảnh gần đúng trên thiết bị của người dùng:

Bản vẽ đơn giản về hai thiết bị hiển thị văn bản bằng tiếng Anh và tiếng Tây Ban Nha

Node.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);
  });

NGHỈ NGƠI

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"],
                    },
                 },
               },
             },
  },
}'

Xem tài liệu tham khảo HTTP v1 để biết chi tiết đầy đủ về các khóa có sẵn trong các khối dành riêng cho nền tảng trong nội dung thư.

Mã lỗi REST cho API HTTP v1

Phản hồi lỗi HTTP cho API HTTP v1 chứa mã lỗi, thông báo lỗi và trạng thái lỗi. Chúng cũng có thể chứa một mảng details với nhiều chi tiết hơn về lỗi.

Dưới đây là hai phản hồi lỗi mẫu:

Ví dụ 1: Phản hồi lỗi từ yêu cầu API HTTP v1 có giá trị không hợp lệ trong thông báo dữ liệu

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'message.data[0].value' (TYPE_STRING), 12",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "message.data[0].value",
            "description": "Invalid value at 'message.data[0].value' (TYPE_STRING), 12"
          }
        ]
      }
    ]
  }
}

Ví dụ 2: Phản hồi lỗi từ yêu cầu API HTTP v1 có mã thông báo đăng ký không hợp lệ

{
  "error": {
    "code": 400,
    "message": "The registration token is not a valid FCM registration token",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.firebase.fcm.v1.FcmError",
        "errorCode": "INVALID_ARGUMENT"
      }
    ]
   }
}

Lưu ý rằng cả hai thông báo đều có cùng mã và trạng thái, nhưng mảng chi tiết chứa các giá trị thuộc các loại khác nhau. Ví dụ đầu tiên có loại type.googleapis.com/google.rpc.BadRequest cho biết có lỗi trong các giá trị yêu cầu. Ví dụ thứ hai với loại type.googleapis.com/google.firebase.fcm.v1.FcmError có lỗi cụ thể FCM. Đối với nhiều lỗi, mảng chi tiết chứa thông tin bạn cần để gỡ lỗi và tìm giải pháp.

Bảng sau liệt kê các mã lỗi API FCM v1 REST và mô tả của chúng.

Mã lỗi Các bước mô tả và giải quyết
UNSPECIFIED_ERROR Không có thêm thông tin nào về lỗi này. Không có.
INVALID_ARGUMENT (Mã lỗi HTTP = 400) Tham số yêu cầu không hợp lệ. Phần mở rộng thuộc loại google.rpc.BadRequest được trả về để chỉ định trường nào không hợp lệ. Các nguyên nhân tiềm ẩn bao gồm đăng ký không hợp lệ, tên gói không hợp lệ, tin nhắn quá lớn, khóa dữ liệu không hợp lệ, TTL không hợp lệ hoặc các tham số không hợp lệ khác.
Đăng ký không hợp lệ : Kiểm tra định dạng của mã thông báo đăng ký bạn chuyển đến máy chủ. Đảm bảo rằng nó khớp với mã thông báo đăng ký mà ứng dụng khách nhận được khi đăng ký với FCM. Không cắt bớt mã thông báo hoặc thêm ký tự bổ sung.
Tên gói không hợp lệ : Đảm bảo thư được gửi tới mã thông báo đăng ký có tên gói khớp với giá trị được chuyển trong yêu cầu.
Tin nhắn quá lớn : Kiểm tra để đảm bảo tổng kích thước của dữ liệu tải trọng có trong tin nhắn không vượt quá giới hạn FCM: 4096 byte cho hầu hết các tin nhắn hoặc 2048 byte trong trường hợp tin nhắn đến chủ đề. Điều này bao gồm cả khóa và giá trị.
Khóa dữ liệu không hợp lệ : Kiểm tra để đảm bảo rằng dữ liệu tải trọng không chứa khóa (chẳng hạn như từ, hoặc gcm hoặc bất kỳ giá trị nào được bắt đầu bởi google) được FCM sử dụng nội bộ. Lưu ý rằng một số từ (chẳng hạn như thu gọn_key) cũng được FCM sử dụng nhưng được phép trong tải trọng, trong trường hợp đó giá trị tải trọng sẽ bị ghi đè bởi giá trị FCM.
TTL không hợp lệ : Kiểm tra xem giá trị được sử dụng trong ttl có phải là số nguyên biểu thị thời lượng tính bằng giây trong khoảng từ 0 đến 2.419.200 (4 tuần).
Tham số không hợp lệ : Kiểm tra xem các tham số được cung cấp có đúng tên và loại hay không.
CHƯA UNREGISTERED (mã lỗi HTTP = 404) Phiên bản ứng dụng đã bị hủy đăng ký khỏi FCM. Điều này thường có nghĩa là mã thông báo được sử dụng không còn hợp lệ và phải sử dụng mã mới. Lỗi này có thể do thiếu mã thông báo đăng ký hoặc mã thông báo chưa được đăng ký.
Thiếu đăng ký : Nếu mục tiêu của tin nhắn là giá trị token , hãy kiểm tra xem yêu cầu có chứa mã thông báo đăng ký hay không.
Chưa được đăng ký : Mã thông báo đăng ký hiện có có thể không còn hiệu lực trong một số trường hợp, bao gồm:
- Nếu ứng dụng khách hủy đăng ký với FCM.
- Nếu ứng dụng khách tự động bị hủy đăng ký, điều này có thể xảy ra nếu người dùng gỡ cài đặt ứng dụng. Ví dụ: trên iOS, nếu Dịch vụ phản hồi của APN báo cáo mã thông báo APN là không hợp lệ.
- Nếu mã thông báo đăng ký hết hạn (ví dụ: Google có thể quyết định làm mới mã thông báo đăng ký hoặc mã thông báo APN đã hết hạn đối với thiết bị iOS).
- Nếu ứng dụng khách được cập nhật nhưng phiên bản mới không được cấu hình để nhận tin nhắn.
Đối với tất cả các trường hợp này, hãy xóa mã thông báo đăng ký này khỏi máy chủ ứng dụng và ngừng sử dụng nó để gửi tin nhắn.
SENDER_ID_MISMATCH (Mã lỗi HTTP = 403) ID người gửi được xác thực khác với ID người gửi cho mã thông báo đăng ký. Mã thông báo đăng ký được gắn với một nhóm người gửi nhất định. Khi ứng dụng khách đăng ký FCM, ứng dụng đó phải chỉ định người gửi nào được phép gửi tin nhắn. Bạn nên sử dụng một trong những ID người gửi đó khi gửi tin nhắn đến ứng dụng khách. Nếu bạn chuyển sang người gửi khác, mã thông báo đăng ký hiện có sẽ không hoạt động.
QUOTA_EXCEEDED (Mã lỗi HTTP = 429) Đã vượt quá giới hạn gửi đối với mục tiêu thư. Phần mở rộng thuộc loại google.rpc.QuotaFailure được trả về để chỉ định hạn ngạch nào đã bị vượt quá. Lỗi này có thể do vượt quá hạn mức tốc độ tin nhắn, vượt quá hạn mức tốc độ tin nhắn trên thiết bị hoặc vượt quá hạn mức tốc độ tin nhắn theo chủ đề.
Đã vượt quá tốc độ tin nhắn : Tốc độ gửi tin nhắn quá cao. Bạn phải giảm tốc độ gửi tin nhắn chung. Sử dụng thời gian chờ theo cấp số nhân với độ trễ ban đầu tối thiểu là 1 phút để thử lại các tin nhắn bị từ chối.
Đã vượt quá tốc độ tin nhắn của thiết bị : Tỷ lệ tin nhắn đến một thiết bị cụ thể quá cao. Xem giới hạn tốc độ tin nhắn cho một thiết bị . Giảm số lượng tin nhắn được gửi tới thiết bị này và sử dụng thời gian chờ theo cấp số nhân để thử gửi lại.
Đã vượt quá tỷ lệ tin nhắn chủ đề : Tỷ lệ tin nhắn tới người đăng ký một chủ đề cụ thể quá cao. Giảm số lượng thư được gửi cho chủ đề này và sử dụng thời gian chờ theo cấp số nhân với độ trễ ban đầu tối thiểu là 1 phút để thử gửi lại.
UNAVAILABLE CÓ (Mã lỗi HTTP = 503) Máy chủ bị quá tải. Máy chủ không thể xử lý yêu cầu kịp thời. Hãy thử lại yêu cầu tương tự, nhưng bạn phải:
- Tôn trọng tiêu đề Retry-After nếu nó được bao gồm trong phản hồi từ Máy chủ kết nối FCM.
- Triển khai dự phòng theo cấp số nhân trong cơ chế thử lại của bạn. (ví dụ: nếu bạn đợi một giây trước lần thử lại đầu tiên, hãy đợi ít nhất hai giây trước lần thử tiếp theo, sau đó là 4 giây, v.v.). Nếu bạn đang gửi nhiều tin nhắn, hãy cân nhắc việc áp dụng hiện tượng jitter. Để biết thêm thông tin, hãy xem Xử lý lần thử lại . Người gửi gây ra vấn đề có nguy cơ bị từ chối.
INTERNAL (Mã lỗi HTTP = 500) Đã xảy ra lỗi nội bộ không xác định. Máy chủ gặp lỗi khi cố gắng xử lý yêu cầu. Bạn có thể thử lại yêu cầu tương tự theo các đề xuất trong Xử lý lần thử lại . Nếu lỗi vẫn tiếp diễn, vui lòng liên hệ với bộ phận hỗ trợ của Firebase.
THIRD_PARTY_AUTH_ERROR (Mã lỗi HTTP = 401) Chứng chỉ APN hoặc khóa xác thực đẩy web không hợp lệ hoặc bị thiếu. Không thể gửi tin nhắn được nhắm mục tiêu đến thiết bị iOS hoặc đăng ký đẩy web. Kiểm tra tính hợp lệ của thông tin phát triển và sản xuất của bạn.

Mã lỗi quản trị viên

Bảng sau liệt kê các mã lỗi API FCM quản trị Firebase và mô tả của chúng, bao gồm các bước giải quyết được đề xuất.

Mã lỗi Các bước mô tả và giải quyết
messaging/invalid-argument Một đối số không hợp lệ đã được cung cấp cho phương thức FCM. Thông báo lỗi phải chứa thông tin bổ sung.
messaging/invalid-recipient Người nhận tin nhắn dự định không hợp lệ. Thông báo lỗi phải chứa thông tin bổ sung.
messaging/invalid-payload Một đối tượng tải trọng tin nhắn không hợp lệ đã được cung cấp. Thông báo lỗi phải chứa thông tin bổ sung.
messaging/invalid-data-payload-key Tải trọng thông điệp dữ liệu chứa khóa không hợp lệ. Xem tài liệu tham khảo về DataMessagePayload để biết các khóa bị hạn chế.
messaging/payload-size-limit-exceeded Tải trọng tin nhắn được cung cấp vượt quá giới hạn kích thước FCM. Giới hạn là 4096 byte cho hầu hết các tin nhắn. Đối với tin nhắn được gửi đến chủ đề, giới hạn là 2048 byte. Tổng kích thước tải trọng bao gồm cả khóa và giá trị.
messaging/invalid-options Đối tượng tùy chọn tin nhắn không hợp lệ đã được cung cấp. Thông báo lỗi phải chứa thông tin bổ sung.
messaging/invalid-registration-token Mã thông báo đăng ký được cung cấp không hợp lệ. Đảm bảo rằng nó khớp với mã thông báo đăng ký mà ứng dụng khách nhận được khi đăng ký với FCM. Không cắt bớt hoặc thêm ký tự bổ sung vào nó.
messaging/registration-token-not-registered Mã thông báo đăng ký được cung cấp chưa được đăng ký. Mã thông báo đăng ký hợp lệ trước đó có thể bị hủy đăng ký vì nhiều lý do, bao gồm:
  • Ứng dụng khách đã tự hủy đăng ký khỏi FCM.
  • Ứng dụng khách đã tự động bị hủy đăng ký. Điều này có thể xảy ra nếu người dùng gỡ cài đặt ứng dụng hoặc trên nền tảng Apple, nếu Dịch vụ phản hồi của APN báo cáo mã thông báo APN là không hợp lệ.
  • Mã thông báo đăng ký đã hết hạn. Ví dụ: Google có thể quyết định làm mới mã thông báo đăng ký hoặc mã thông báo APN có thể đã hết hạn đối với các thiết bị Apple.
  • Ứng dụng khách đã được cập nhật nhưng phiên bản mới chưa được định cấu hình để nhận tin nhắn.
Đối với tất cả các trường hợp này, hãy xóa mã thông báo đăng ký này và ngừng sử dụng nó để gửi tin nhắn.
messaging/invalid-package-name Thông báo được gửi tới mã thông báo đăng ký có tên gói không khớp với tùy chọn restrictedPackageName được cung cấp.
messaging/message-rate-exceeded Tỷ lệ tin nhắn đến một mục tiêu cụ thể quá cao. Giảm số lượng tin nhắn được gửi đến thiết bị hoặc chủ đề này và không thử gửi lại ngay lập tức tới mục tiêu này.
messaging/device-message-rate-exceeded Tỷ lệ tin nhắn tới một thiết bị cụ thể quá cao. Giảm số lượng tin nhắn được gửi tới thiết bị này và không thử gửi lại ngay lập tức.
messaging/topics-message-rate-exceeded Tỷ lệ tin nhắn tới người đăng ký theo một chủ đề cụ thể quá cao. Giảm số lượng tin nhắn được gửi cho chủ đề này và không thử gửi lại chủ đề này ngay lập tức.
messaging/too-many-topics Mã thông báo đăng ký đã được đăng ký với số lượng chủ đề tối đa và không thể đăng ký thêm nữa.
messaging/invalid-apns-credentials Không thể gửi tin nhắn nhắm mục tiêu đến thiết bị Apple vì chứng chỉ SSL APN bắt buộc chưa được tải lên hoặc đã hết hạn. Kiểm tra tính hợp lệ của chứng chỉ phát triển và sản xuất của bạn.
messaging/mismatched-credential Thông tin xác thực được sử dụng để xác thực SDK này không có quyền gửi tin nhắn đến thiết bị tương ứng với mã thông báo đăng ký được cung cấp. Đảm bảo cả thông tin xác thực và mã thông báo đăng ký đều thuộc cùng một dự án Firebase. Xem Thêm Firebase vào ứng dụng của bạn để biết tài liệu về cách xác thực SDK quản trị Firebase.
messaging/authentication-error SDK không thể xác thực với máy chủ FCM. Đảm bảo bạn xác thực SDK quản trị Firebase bằng thông tin xác thực có quyền thích hợp để gửi tin nhắn FCM. Xem Thêm Firebase vào ứng dụng của bạn để biết tài liệu về cách xác thực SDK quản trị Firebase.
messaging/server-unavailable Máy chủ FCM không thể xử lý yêu cầu kịp thời. Bạn nên thử lại yêu cầu tương tự, nhưng bạn phải:
  • Tôn trọng tiêu đề Retry-After nếu nó được bao gồm trong phản hồi từ Máy chủ kết nối FCM.
  • Triển khai dự phòng theo cấp số nhân trong cơ chế thử lại của bạn. Ví dụ: nếu bạn đợi một giây trước lần thử lại đầu tiên, hãy đợi ít nhất hai giây trước lần thử tiếp theo, sau đó là bốn giây, v.v. Nếu bạn đang gửi nhiều tin nhắn, hãy trì hoãn từng tin nhắn một cách độc lập một lượng ngẫu nhiên bổ sung để tránh đưa ra yêu cầu mới cho tất cả tin nhắn cùng một lúc.
Người gửi gây ra vấn đề có nguy cơ bị đưa vào danh sách đen.
messaging/internal-error Máy chủ FCM đã gặp lỗi khi cố gắng xử lý yêu cầu. Bạn có thể thử lại yêu cầu tương tự theo các yêu cầu được liệt kê trong hàng messaging/server-unavailable ở trên. Nếu lỗi vẫn tiếp diễn, vui lòng báo cáo sự cố lên kênh hỗ trợ Báo cáo lỗi của chúng tôi.
messaging/unknown-error Đã trả về một lỗi máy chủ không xác định. Xem phản hồi của máy chủ thô trong thông báo lỗi để biết thêm chi tiết. Nếu bạn nhận được lỗi này, vui lòng báo cáo thông báo lỗi đầy đủ tới kênh hỗ trợ Báo cáo lỗi của chúng tôi.

Gửi tin nhắn bằng giao thức máy chủ ứng dụng cũ

Nếu bạn hiện đang sử dụng các giao thức cũ, hãy tạo các yêu cầu tin nhắn như được hiển thị trong phần này. Hãy nhớ rằng, nếu bạn đang gửi tới nhiều nền tảng qua HTTP, giao thức v1 có thể đơn giản hóa rất nhiều yêu cầu tin nhắn của bạn.

Gửi tin nhắn đến các thiết bị cụ thể

Để gửi tin nhắn đến các thiết bị cụ thể, hãy đặt phím to thành mã thông báo đăng ký cho phiên bản ứng dụng cụ thể. Xem thông tin thiết lập ứng dụng khách cho nền tảng của bạn để tìm hiểu thêm về mã thông báo đăng ký.

Yêu cầu 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..."
}

Phản hồi HTTP

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

Tin nhắn XMPP

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

Phản hồi XMPP

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

Máy chủ kết nối XMPP cung cấp một số tùy chọn khác để phản hồi. Xem Định dạng phản hồi của máy chủ .

Để biết danh sách đầy đủ các tùy chọn tin nhắn có sẵn khi gửi tin nhắn xuôi dòng tới ứng dụng khách, hãy xem thông tin tham khảo cho giao thức máy chủ kết nối đã chọn của bạn, HTTP hoặc XMPP .

Gửi tin nhắn đến chủ đề

Gửi tin nhắn đến chủ đề Nhắn tin qua đám mây của Firebase rất giống với việc gửi tin nhắn đến một thiết bị riêng lẻ hoặc tới một nhóm người dùng. Máy chủ ứng dụng đặt khóa to có giá trị như /topics/yourTopic . Nhà phát triển có thể chọn bất kỳ tên chủ đề nào khớp với biểu thức chính quy: "/topics/[a-zA-Z0-9-_.~%]+" .

Để gửi tới các tổ hợp nhiều chủ đề, máy chủ ứng dụng phải đặt khóa condition (thay vì phím to ) thành điều kiện boolean chỉ định các chủ đề đích. Ví dụ: để gửi tin nhắn đến các thiết bị đã đăng ký TopicATopicB hoặc TopicC :

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

Trước tiên FCM đánh giá mọi điều kiện trong ngoặc đơn, sau đó đánh giá biểu thức từ trái sang phải. Trong biểu thức trên, người dùng đăng ký bất kỳ chủ đề nào sẽ không nhận được tin nhắn. Tương tự, người dùng không đăng ký TopicA sẽ không nhận được tin nhắn. Những kết hợp này nhận được nó:

  • Chủ đềA và Chủ đềB
  • Chủ đềA và Chủ đềC

Bạn có thể bao gồm tối đa năm chủ đề trong biểu thức điều kiện của mình và dấu ngoặc đơn được hỗ trợ. Các toán tử được hỗ trợ: && , || .

Chủ đề HTTP POST yêu cầu

Gửi đến một chủ đề duy nhất:

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


Gửi tới các thiết bị đã đăng ký chủ đề "chó" hoặc "mèo":

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


Phản hồi HTTP chủ đề

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

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

Tin nhắn XMPP chủ đề

Gửi đến một chủ đề duy nhất:

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


  </gcm>
</message>

Gửi tới các thiết bị đã đăng ký chủ đề "chó" hoặc "mèo":

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


  </gcm>
</message>

Phản hồi chủ đề XMPP

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

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

Dự kiến ​​sẽ có độ trễ tối đa 30 giây trước khi Máy chủ FCM trả về phản hồi thành công hoặc thất bại cho các yêu cầu gửi chủ đề. Đảm bảo đặt giá trị thời gian chờ của máy chủ ứng dụng trong yêu cầu tương ứng.

Gửi tin nhắn đến các nhóm thiết bị

Việc gửi tin nhắn đến một nhóm thiết bị bằng cách sử dụng các API cũ không còn được dùng nữa cũng rất giống với việc gửi tin nhắn đến một thiết bị riêng lẻ. Đặt tham to thành phím thông báo duy nhất cho nhóm thiết bị. Các ví dụ trong phần này trình bày cách gửi tin nhắn dữ liệu đến các nhóm thiết bị trong giao thức HTTP và XMPP cũ.

Yêu cầu POST HTTP của nhóm thiết bị

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!",
   }
}

Phản hồi HTTP của nhóm thiết bị

Đây là một ví dụ về "thành công"— notification_key có 2 mã thông báo đăng ký được liên kết với nó và thông báo đã được gửi thành công cho cả hai:

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

Đây là ví dụ về "thành công một phần" — notification_key có 3 mã thông báo đăng ký được liên kết với nó. Tin nhắn chỉ được gửi thành công tới 1 trong số các mã thông báo đăng ký. Thông báo phản hồi liệt kê các mã thông báo đăng ký ( registration_ids ) không nhận được thông báo:

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

Khi tin nhắn không được gửi tới một hoặc nhiều mã thông báo đăng ký được liên kết với notification_key , máy chủ ứng dụng sẽ thử lại với thời gian chờ giữa các lần thử.

Nếu máy chủ cố gắng gửi tin nhắn đến một nhóm thiết bị không có thành viên nào thì phản hồi sẽ như sau, với 0 thành công và 0 thất bại:

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

Tin nhắn XMPP của nhóm thiết bị

<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>

Phản hồi XMPP của nhóm thiết bị

Khi tin nhắn được gửi thành công đến bất kỳ thiết bị nào trong nhóm, máy chủ kết nối XMPP sẽ phản hồi bằng ACK. Nếu tất cả tin nhắn được gửi đến tất cả các thiết bị trong nhóm đều không thành công, máy chủ kết nối XMPP sẽ phản hồi bằng NACK.

Đây là một ví dụ về "thành công" — notification_key có 3 mã thông báo đăng ký được liên kết với nó và thông báo đã được gửi thành công tới tất cả chúng:

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

Đây là ví dụ về "thành công một phần" — notification_key có 3 mã thông báo đăng ký được liên kết với nó. Tin nhắn chỉ được gửi thành công tới 1 trong số các mã thông báo đăng ký. Thông báo phản hồi liệt kê các mã thông báo đăng ký không nhận được thông báo:

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

Khi máy chủ kết nối FCM không gửi được tới tất cả các thiết bị trong nhóm. Máy chủ ứng dụng sẽ nhận được phản hồi nack.

Để biết danh sách đầy đủ các tùy chọn tin nhắn, hãy xem thông tin tham khảo cho giao thức máy chủ kết nối mà bạn đã chọn, HTTP hoặc XMPP .

Phương thức gửi kế thừa SDK quản trị Firebase

SDK Node.js quản trị Firebase hỗ trợ các phương thức gửi tin nhắn (FCM) dựa trên API máy chủ FCM kế thừa . Các phương thức này chấp nhận các đối số khác nhau so với phương thức send() . Bạn nên sử dụng phương thức send() bất cứ khi nào có thể và chỉ sử dụng các phương thức được mô tả trong trang này khi gửi tin nhắn đến từng thiết bị hoặc nhóm thiết bị.

Gửi đến các thiết bị riêng lẻ

Bạn có thể chuyển mã thông báo đăng ký tới phương thức sendToDevice() để gửi tin nhắn đến thiết bị đó:

Node.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);
  });

Phương thức sendToDevice() cũng có thể gửi một tin nhắn multicast (nghĩa là một tin nhắn đến nhiều thiết bị) bằng cách chuyển một mảng mã thông báo đăng ký thay vì chỉ một mã thông báo đăng ký:

Node.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);
  });

Phương thức sendToDevice() trả về một lời hứa đã được giải quyết bằng đối tượng MessagingDevicesResponse chứa phản hồi từ FCM. Kiểu trả về có cùng định dạng khi chuyển một mã thông báo đăng ký hoặc một mảng mã thông báo đăng ký.

Một số trường hợp như lỗi xác thực hoặc giới hạn tốc độ khiến toàn bộ tin nhắn không thể xử lý được. Trong những trường hợp này, lời hứa được trả về bởi sendToDevice() bị từ chối do có lỗi. Để biết danh sách đầy đủ các mã lỗi, bao gồm mô tả và các bước giải quyết, hãy xem Lỗi API FCM của quản trị viên .

Gửi đến một nhóm thiết bị

Phương thức sendToDeviceGroup() cho phép bạn gửi tin nhắn đến một nhóm thiết bị bằng cách chỉ định khóa thông báo cho nhóm thiết bị đó:

Node.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);
  });

Phương thức sendToDeviceGroup() trả về một lời hứa đã được giải quyết bằng đối tượng MessagingDevicesResponse chứa phản hồi từ FCM.

Một số trường hợp như lỗi xác thực hoặc giới hạn tốc độ khiến toàn bộ tin nhắn không thể xử lý được. Trong những trường hợp này, lời hứa được trả về bởi sendToDeviceGroup() bị từ chối do có lỗi. Để biết danh sách đầy đủ các mã lỗi, bao gồm mô tả và các bước giải quyết, hãy xem Lỗi API FCM của quản trị viên .

Xác định tải trọng tin nhắn

Các phương pháp trên dựa trên giao thức kế thừa FCM chấp nhận tải trọng tin nhắn làm đối số thứ hai và hỗ trợ cả thông báo và tin nhắn dữ liệu . Bạn có thể chỉ định một hoặc cả hai loại thông báo bằng cách tạo một đối tượng bằng các phím data và/hoặc notification . Ví dụ: đây là cách xác định các loại tải trọng tin nhắn khác nhau:

Tin nhắn thông báo

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.'
  }
};

Thông báo dữ liệu

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

Tin nhắn kết hợp

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'
  }
};

Tải trọng tin nhắn thông báo có một tập hợp con các thuộc tính hợp lệ được xác định trước và hơi khác nhau tùy thuộc vào hệ điều hành di động mà bạn đang nhắm mục tiêu. Xem tài liệu tham khảo về NotificationMessagePayload để biết danh sách đầy đủ.

Tải trọng của thông báo dữ liệu bao gồm các cặp khóa-giá trị tùy chỉnh với một số hạn chế, bao gồm cả thực tế là tất cả các giá trị phải là chuỗi. Xem tài liệu tham khảo về DataMessagePayload để biết danh sách đầy đủ các hạn chế.

Xác định các tùy chọn tin nhắn

Các phương thức trên dựa trên giao thức kế thừa FCM chấp nhận đối số thứ ba tùy chọn chỉ định một số tùy chọn cho thông báo. Ví dụ: ví dụ sau gửi tin nhắn có mức độ ưu tiên cao tới một thiết bị sẽ hết hạn sau 24 giờ:

Node.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);
  });

Xem tài liệu tham khảo về MessagingOptions để biết danh sách đầy đủ các tùy chọn có sẵn.