Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

สร้างเซิร์ฟเวอร์แอปส่งคำขอ

การใช้โปรโตคอลเซิร์ฟเวอร์แอป Firebase Admin SDK หรือ FCM ช่วยให้คุณสร้างคำขอข้อความและส่งไปยังเป้าหมายประเภทต่อไปนี้ได้

  • ชื่อกระทู้
  • สภาพ
  • โทเค็นการลงทะเบียนอุปกรณ์
  • ชื่อกลุ่มอุปกรณ์ (โปรโตคอลเดิมและ Firebase Admin SDK สำหรับ Node.js เท่านั้น)

คุณสามารถส่งข้อความพร้อมเพย์โหลดการแจ้งเตือนที่ประกอบด้วยฟิลด์ที่กำหนดไว้ล่วงหน้า เพย์โหลดข้อมูลของฟิลด์ที่ผู้ใช้กำหนดเอง หรือข้อความที่มีเพย์โหลดทั้งสองประเภท ดู ประเภทข้อความ สำหรับข้อมูลเพิ่มเติม

ตัวอย่างในการแสดงหน้านี้วิธีการส่งข้อความแจ้งเตือนโดยใช้ Firebase SDK ผู้ดูแลระบบ (ซึ่งมีการสนับสนุน โหนด , Java , Python , C # และ ไป ) และ โปรโตคอล HTTP v1 นอกจากนี้ยังมีคำแนะนำสำหรับการส่งข้อความผ่านทาง HTTP มรดกและโปรโตคอล XMPP

ส่งข้อความไปยังอุปกรณ์เฉพาะ

หากต้องการส่งไปยังอุปกรณ์เครื่องเดียว ให้ส่งโทเค็นการลงทะเบียนของอุปกรณ์ตามที่แสดง ดูข้อมูลการตั้งค่าไคลเอนต์สำหรับแพลตฟอร์มของคุณเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับโทเค็นการลงทะเบียน

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)

ไป

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

เมื่อสำเร็จ แต่ละวิธีส่งกลับ ID ข้อความ Firebase SDK ผู้ดูแลระบบกลับสตริง ID ในรูปแบบ projects/{project_id}/messages/{message_id} การตอบสนองโปรโตคอล HTTP เป็นคีย์ JSON เดียว:

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

ส่งข้อความไปยังอุปกรณ์หลายเครื่อง

REST API และ Admin FCM API อนุญาตให้คุณส่งหลายข้อความไปยังรายการโทเค็นการลงทะเบียนอุปกรณ์ คุณสามารถระบุโทเค็นการลงทะเบียนอุปกรณ์ได้สูงสุด 500 รายการต่อการเรียกใช้

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

ไป

// Create a list containing up to 100 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
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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"' https://fcm.googleapis.com/batch

สำหรับผู้ดูแลระบบ Firebase SDK ของการดำเนินการนี้ใช้ sendAll() API ภายใต้ประทุนดังแสดงในตัวอย่าง ค่าตอบแทนเป็น BatchResponse ที่มีการตอบสนองที่สอดคล้องกับรายการการสั่งซื้อสินค้าของสัญญาณอินพุต สิ่งนี้มีประโยชน์เมื่อคุณต้องการตรวจสอบว่าโทเค็นใดทำให้เกิดข้อผิดพลาด

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

ไป

// Create a list containing up to 100 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--

ส่งข้อความไปยังหัวข้อ

หลังจากที่คุณได้สร้างหัวข้อทั้งโดยสมัครกรณี app ลูกค้ากับหัวข้อในฝั่งไคลเอ็นต์หรือผ่านทาง เซิร์ฟเวอร์ API คุณสามารถส่งข้อความไปยังหัวข้อ ถ้านี่เป็นครั้งแรกของการสร้างการร้องขอส่งสำหรับ FCM ดูคู่มือเพื่อ สภาพแวดล้อมเซิร์ฟเวอร์ของคุณและ FCM สำหรับพื้นหลังที่สำคัญและข้อมูลการตั้งค่า

ในตรรกะการส่งของคุณบนแบ็กเอนด์ ให้ระบุชื่อหัวข้อที่ต้องการดังที่แสดง:

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)

ไป

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

เพื่อส่งข้อความไปยังการรวมกันของหัวข้อระบุเป็นเงื่อนไขซึ่งเป็นนิพจน์บูลีนที่ระบุหัวข้อเป้าหมาย ยกตัวอย่างเช่นเงื่อนไขต่อไปนี้จะส่งข้อความไปยังอุปกรณ์ที่สมัครเป็นสมาชิก TopicA และทั้ง TopicB หรือ TopicC :

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

FCM จะประเมินเงื่อนไขใดๆ ในวงเล็บก่อน จากนั้นจึงประเมินนิพจน์จากซ้ายไปขวา ในนิพจน์ข้างต้น ผู้ใช้ที่สมัครรับข่าวสารในหัวข้อเดียวจะไม่ได้รับข้อความ ในทำนองเดียวกันผู้ใช้ที่ไม่ได้สมัครเป็นสมาชิก TopicA ไม่ได้รับข้อความ ชุดค่าผสมเหล่านี้ได้รับ:

  • TopicA และ TopicB
  • TopicA และ TopicC

คุณสามารถรวมหัวข้อได้ถึงห้าหัวข้อในนิพจน์เงื่อนไขของคุณ

ในการส่งไปยังเงื่อนไข:

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)

ไป

// 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 แยกกันสำหรับแต่ละข้อความ

คุณลักษณะนี้สามารถใช้เพื่อสร้างชุดข้อความที่กำหนดเองและส่งไปยังผู้รับที่แตกต่างกัน รวมถึงหัวข้อหรือโทเค็นการลงทะเบียนอุปกรณ์เฉพาะ ใช้คุณลักษณะนี้ ตัวอย่างเช่น เมื่อคุณต้องการส่งข้อความไปยังผู้ชมต่างๆ พร้อมกันโดยมีรายละเอียดแตกต่างกันเล็กน้อยในเนื้อหาข้อความ

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

ไป

// Create a list containing up to 100 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
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

คำขอข้อความต้องมีคีย์ "direct_boot_ok" : true ใน AndroidConfig ตัวเลือกของร่างกายร้องขอ ตัวอย่างเช่น:

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

ส่งโดยใช้ HTTP API ดั้งเดิมของ FCM

คำขอข้อความต้องมีคีย์ "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 SDK ผู้ดูแลระบบและ FCM v1 โปรโตคอล HTTP ทั้งอนุญาตการร้องขอข้อความของคุณในการตั้งค่าเขตข้อมูลทั้งหมดที่มีอยู่ใน message วัตถุ ซึ่งรวมถึง:

  • ชุดทั่วไปของเขตข้อมูลที่จะถูกตีความโดยอินสแตนซ์ทั้งหมดของแอปที่ได้รับข้อความ
  • ชุดเฉพาะแพลตฟอร์มของเขตข้อมูลเช่น AndroidConfig และ WebpushConfig ตีความโดยอินสแตนซ์แอปที่ทำงานบนแพลตฟอร์มที่ระบุเท่านั้น

บล็อกเฉพาะแพลตฟอร์มให้ความยืดหยุ่นในการปรับแต่งข้อความสำหรับแพลตฟอร์มต่างๆ เพื่อให้แน่ใจว่าจะได้รับการจัดการอย่างถูกต้องเมื่อได้รับ แบ็กเอนด์ของ FCM จะพิจารณาพารามิเตอร์ที่ระบุทั้งหมดและปรับแต่งข้อความสำหรับแต่ละแพลตฟอร์ม

เมื่อใดควรใช้ฟิลด์ทั่วไป

ใช้ฟิลด์ทั่วไปเมื่อคุณ:

  • การกำหนดเป้าหมายกรณีแอปบนแพลตฟอร์มทั้งหมด - iOS, Android, และเว็บ
  • กำลังส่งข้อความไปยังหัวข้อ

อินสแตนซ์ของแอปทั้งหมด โดยไม่คำนึงถึงแพลตฟอร์ม สามารถตีความฟิลด์ทั่วไปต่อไปนี้:

เมื่อใดควรใช้ฟิลด์เฉพาะแพลตฟอร์ม

ใช้ฟิลด์เฉพาะแพลตฟอร์มเมื่อคุณต้องการ:

  • ส่งฟิลด์ไปยังแพลตฟอร์มเฉพาะเท่านั้น
  • ส่งสาขาเฉพาะแพลตฟอร์มนอกเหนือไปจากเขตที่พบบ่อย

เมื่อใดก็ตามที่คุณต้องการส่งค่าเฉพาะกับแพลตฟอร์มโดยเฉพาะอย่างยิ่งไม่ใช้เขตข้อมูลทั่วไป ใช้ฟิลด์เฉพาะแพลตฟอร์ม ตัวอย่างเช่น ในการส่งการแจ้งเตือนไปยัง iOS และเว็บเท่านั้น แต่ไม่ส่งไปยัง Android คุณต้องใช้ฟิลด์แยกกันสองชุด ชุดหนึ่งสำหรับ iOS และอีกชุดสำหรับเว็บ

เมื่อคุณส่งข้อความที่มีเฉพาะ การส่งตัวเลือก ให้ใช้เขตแพลตฟอร์มที่เฉพาะเจาะจงเพื่อตั้งพวกเขา คุณสามารถระบุค่าต่างๆ สำหรับแต่ละแพลตฟอร์มได้หากต้องการ อย่างไรก็ตาม แม้ว่าคุณต้องการตั้งค่าโดยพื้นฐานแล้วในแพลตฟอร์มต่างๆ คุณต้องใช้ฟิลด์เฉพาะแพลตฟอร์ม นี้เป็นเพราะแต่ละแพลตฟอร์มอาจตีความค่าที่แตกต่างกันเล็กน้อยตัวอย่างเช่นเวลาที่มีชีวิตอยู่ตั้งอยู่บน Android เป็นเวลาหมดอายุในไม่กี่วินาทีในขณะที่บน iOS มันถูกกำหนดให้เป็นวันหมดอายุ

ตัวอย่าง: ข้อความแจ้งเตือนพร้อมตัวเลือกสีและไอคอน

ตัวอย่างนี้ส่งคำขอส่งชื่อการแจ้งเตือนและเนื้อหาทั่วไปไปยังทุกแพลตฟอร์ม แต่ยังส่งการแทนที่เฉพาะแพลตฟอร์มบางอย่างไปยังอุปกรณ์ Android

สำหรับ Android คำขอจะตั้งค่าไอคอนและสีพิเศษเพื่อแสดงบนอุปกรณ์ Android ตามที่ระบุไว้ในการอ้างอิงสำหรับ AndroidNotification สีจะถูกระบุไว้ในรูปแบบ # RRGGBB และภาพจะต้องเป็นทรัพยากรไอคอน drawable ท้องถิ่นเพื่อแอป Android

ต่อไปนี้คือค่าประมาณของเอฟเฟกต์ภาพบนอุปกรณ์ของผู้ใช้:

การวาดอุปกรณ์สองเครื่องอย่างง่าย โดยเครื่องหนึ่งแสดงไอคอนและสีที่กำหนดเอง

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

ไป

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 เพื่อดูรายละเอียดที่สมบูรณ์เกี่ยวกับกุญแจที่มีอยู่ในบล็อกแพลตฟอร์มที่เฉพาะเจาะจงในเนื้อหาของข้อความ

ตัวอย่าง: ข้อความแจ้งเตือนพร้อมรูปภาพที่กำหนดเอง

ตัวอย่างต่อไปนี้ส่งคำขอส่งชื่อการแจ้งเตือนทั่วไปไปยังทุกแพลตฟอร์ม แต่ยังส่งรูปภาพด้วย นี่คือค่าประมาณของเอฟเฟกต์ภาพบนอุปกรณ์ของผู้ใช้:

การวาดภาพอย่างง่ายในการแจ้งเตือนการแสดงผล

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

พักผ่อน

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 เพื่อดูรายละเอียดที่สมบูรณ์เกี่ยวกับกุญแจที่มีอยู่ในบล็อกแพลตฟอร์มที่เฉพาะเจาะจงในเนื้อหาของข้อความ

ตัวอย่าง: ข้อความแจ้งเตือนที่มีการคลิกที่เกี่ยวข้อง

ตัวอย่างต่อไปนี้ส่งคำขอส่งชื่อการแจ้งเตือนทั่วไปไปยังทุกแพลตฟอร์ม แต่ยังส่งการดำเนินการสำหรับแอปเพื่อตอบสนองต่อผู้ใช้ที่โต้ตอบกับการแจ้งเตือน ต่อไปนี้คือค่าประมาณของเอฟเฟกต์ภาพบนอุปกรณ์ของผู้ใช้:

วาดง่าย ๆ ของผู้ใช้แตะเปิดหน้าเว็บ

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

พักผ่อน

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 เพื่อดูรายละเอียดที่สมบูรณ์เกี่ยวกับกุญแจที่มีอยู่ในบล็อกแพลตฟอร์มที่เฉพาะเจาะจงในเนื้อหาของข้อความ

ตัวอย่าง: ข้อความแจ้งเตือนพร้อมตัวเลือกการแปล

ตัวอย่างต่อไปนี้ส่งคำขอส่งตัวเลือกการแปลสำหรับไคลเอ็นต์เพื่อแสดงข้อความที่แปลแล้ว ต่อไปนี้คือค่าประมาณของเอฟเฟกต์ภาพบนอุปกรณ์ของผู้ใช้:

การวาดอย่างง่ายของอุปกรณ์สองเครื่องที่แสดงข้อความเป็นภาษาอังกฤษและสเปน

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

พักผ่อน

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 มีการระบุวัตถุ 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
  • แอปไคลเอ็นต์ถูกยกเลิกการลงทะเบียนโดยอัตโนมัติ กรณีนี้อาจเกิดขึ้นได้หากผู้ใช้ถอนการติดตั้งแอปพลิเคชัน หรือบน iOS หาก APNs Feedback Service รายงานว่าโทเค็น APN ไม่ถูกต้อง
  • โทเค็นการลงทะเบียนหมดอายุ ตัวอย่างเช่น Google อาจตัดสินใจรีเฟรชโทเค็นการลงทะเบียน หรือโทเค็น APN อาจหมดอายุสำหรับอุปกรณ์ iOS
  • แอปไคลเอ็นต์ได้รับการอัปเดตแล้ว แต่เวอร์ชันใหม่ไม่ได้รับการกำหนดค่าให้รับข้อความ
สำหรับกรณีเหล่านี้ทั้งหมด ให้ลบโทเค็นการลงทะเบียนนี้และหยุดใช้เพื่อส่งข้อความ
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 ไม่สามารถส่งข้อความที่กำหนดเป้าหมายไปยังอุปกรณ์ iOS เนื่องจากไม่ได้อัปโหลดใบรับรอง APNs SSL หรือหมดอายุ ตรวจสอบความถูกต้องของใบรับรองการพัฒนาและการผลิตของคุณ
messaging/mismatched-credential ข้อมูลรับรองที่ใช้ตรวจสอบสิทธิ์ SDK นี้ไม่มีสิทธิ์ส่งข้อความไปยังอุปกรณ์ที่สอดคล้องกับโทเค็นการลงทะเบียนที่ให้มา ตรวจสอบว่าข้อมูลรับรองและโทเค็นการลงทะเบียนเป็นของโปรเจ็กต์ Firebase เดียวกัน ดู เพิ่ม Firebase แอปของคุณ สำหรับเอกสารเกี่ยวกับวิธีการรับรองความถูกต้อง Firebase ธุรการ SDKs
messaging/authentication-error SDK ไม่สามารถตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ FCM ตรวจสอบให้แน่ใจว่าคุณตรวจสอบสิทธิ์ Firebase Admin SDK ด้วยข้อมูลรับรองซึ่งมีสิทธิ์ที่เหมาะสมในการส่งข้อความ FCM ดู เพิ่ม Firebase แอปของคุณ สำหรับเอกสารเกี่ยวกับวิธีการรับรองความถูกต้อง Firebase ธุรการ SDKs
messaging/server-unavailable เซิร์ฟเวอร์ FCM ไม่สามารถดำเนินการตามคำขอได้ทันเวลา คุณควรลองส่งคำขอเดิมอีกครั้ง แต่คุณต้อง:
  • เกียรติยศ Retry-After หัวถ้ามันจะรวมอยู่ในการตอบสนองจากการเชื่อมต่อ FCM เซิร์ฟเวอร์
  • ใช้การถอยกลับแบบเอ็กซ์โพเนนเชียลในกลไกการลองใหม่ของคุณ ตัวอย่างเช่น หากคุณรอหนึ่งวินาทีก่อนที่จะลองอีกครั้งในครั้งแรก ให้รออย่างน้อยสองวินาทีก่อนครั้งถัดไป จากนั้นสี่วินาที เป็นต้น หากคุณกำลังส่งข้อความหลายข้อความ ให้เลื่อนทีละข้อความทีละรายการโดยสุ่มเพิ่มเพื่อหลีกเลี่ยงการส่งคำขอใหม่สำหรับข้อความทั้งหมดพร้อมกัน
ผู้ส่งที่ทำให้เกิดปัญหาเสี่ยงถูกขึ้นบัญชีดำ
messaging/internal-error เซิร์ฟเวอร์ FCM พบข้อผิดพลาดขณะพยายามประมวลผลคำขอ คุณสามารถลองใหม่อีกครั้งเดียวกับการร้องขอต่อไปนี้ความต้องการที่ระบุไว้ใน messaging/server-unavailable แถวด้านบน หากยังคงมีข้อผิดพลาดโปรดรายงานปัญหาของเรา รายงาน Bug ช่องทางการสนับสนุน
messaging/unknown-error ข้อผิดพลาดของเซิร์ฟเวอร์ที่ไม่รู้จักถูกส่งกลับ ดูการตอบสนองของเซิร์ฟเวอร์ดิบในข้อความแสดงข้อผิดพลาดสำหรับรายละเอียดเพิ่มเติม ถ้าคุณได้รับข้อผิดพลาดนี้โปรดรายงานข้อผิดพลาดของเราเต็มไปยัง รายงาน Bug ช่องทางการสนับสนุน

ส่งข้อความโดยใช้โปรโตคอลเซิร์ฟเวอร์แอปเดิม

หากคุณต้องการใช้โปรโตคอลแบบเดิม ให้สร้างคำขอข้อความตามที่แสดงในหัวข้อนี้ โปรดทราบว่าหากคุณส่งไปยังหลายแพลตฟอร์มผ่าน HTTP โปรโตคอล v1 จะทำให้คำขอข้อความของคุณง่ายขึ้น

ส่งข้อความไปยังอุปกรณ์เฉพาะ

ส่งข้อความไปยังอุปกรณ์เฉพาะการตั้งค่า to สำคัญในการลงทะเบียน token เช่นแอปที่เฉพาะเจาะจง ดูข้อมูลการตั้งค่าไคลเอนต์สำหรับแพลตฟอร์มของคุณเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับโทเค็นการลงทะเบียน

คำขอ 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 Cloud Messaging นั้นคล้ายกับการส่งข้อความไปยังอุปกรณ์แต่ละเครื่องหรือไปยังกลุ่มผู้ใช้ เซิร์ฟเวอร์แอปตั้งค่า to สำคัญที่มีค่าเช่น /topics/yourTopic นักพัฒนาสามารถเลือกชื่อหัวข้อใด ๆ ที่ตรงกับการแสดงออกปกติ: "/topics/[a-zA-Z0-9-_.~%]+"

เพื่อส่งให้กับการรวมกันของหลายหัวข้อเซิร์ฟเวอร์แอปจะต้องกำหนด condition ที่สำคัญ (แทน to คีย์) ให้อยู่ในสภาพแบบบูลที่ระบุหัวข้อเป้าหมาย ตัวอย่างเช่นการส่งข้อความไปยังอุปกรณ์ที่สมัครเป็นสมาชิก TopicA และทั้ง TopicB หรือ TopicC :

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

FCM จะประเมินเงื่อนไขใดๆ ในวงเล็บก่อน จากนั้นจึงประเมินนิพจน์จากซ้ายไปขวา ในนิพจน์ข้างต้น ผู้ใช้ที่สมัครรับข่าวสารในหัวข้อเดียวจะไม่ได้รับข้อความ ในทำนองเดียวกัน ผู้ใช้ที่ไม่ได้สมัครใช้งาน TopicA จะไม่ได้รับข้อความ ชุดค่าผสมเหล่านี้ได้รับ:

  • หัวข้อAและหัวข้อB
  • หัวข้อAและหัวข้อC

คุณสามารถใส่หัวข้อได้ถึงห้าหัวข้อในนิพจน์เงื่อนไขของคุณ และวงเล็บได้รับการสนับสนุน ผู้ประกอบการที่รองรับ: && , || .

คำขอ 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"
}

คาดว่าจะมีความล่าช้าสูงสุด 30 วินาทีก่อนที่เซิร์ฟเวอร์ FCM จะส่งคืนการตอบสนองที่สำเร็จหรือล้มเหลวต่อคำขอส่งหัวข้อ ตรวจสอบให้แน่ใจว่าได้ตั้งค่าการหมดเวลาของเซิร์ฟเวอร์แอปในคำขอตามนั้น

ส่งข้อความไปยังกลุ่มอุปกรณ์

การส่งข้อความไปยังกลุ่มอุปกรณ์นั้นคล้ายกับการส่งข้อความไปยังอุปกรณ์แต่ละเครื่อง ตั้งค่า 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
}

นี่คือตัวอย่างของ "ความสำเร็จบางส่วนที่" - The notification_key มีโทเค็นการลงทะเบียน 3 ที่เกี่ยวข้องกับมัน ข้อความถูกส่งไปยัง 1 โทเค็นการลงทะเบียนสำเร็จเท่านั้น รายการข้อความตอบกลับสัญญาณการลงทะเบียน ( registration_ids ) ที่ล้มเหลวที่จะได้รับข้อความ:

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

เมื่อข้อความล้มเหลวที่จะถูกส่งไปยังหนึ่งหรือมากกว่าของการลงทะเบียนสัญญาณที่เกี่ยวข้องกับ notification_key เซิร์ฟเวอร์ app ที่ควรลองอีกครั้งด้วยการย้อนกลับระหว่างการลอง

หากเซิร์ฟเวอร์พยายามส่งข้อความไปยังกลุ่มอุปกรณ์ที่ไม่มีสมาชิก การตอบสนองจะมีลักษณะดังนี้ โดย 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"
}

นี่คือตัวอย่างของ "ความสำเร็จบางส่วนที่" - The 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 ธุรการ Node.js SDK สนับสนุนวิธีการสำหรับการส่ง (FCM) ข้อความบนพื้นฐานของ เซิร์ฟเวอร์ API มรดก FCM วิธีการเหล่านี้ยอมรับข้อโต้แย้งที่แตกต่างกันเมื่อเทียบกับ send() วิธีการ คุณควรใช้ send() วิธีการเมื่อใดก็ตามที่เป็นไปได้และจะใช้วิธีการที่อธิบายไว้ในหน้านี้เมื่อส่งข้อความไปยังอุปกรณ์ที่แต่ละคนหรือกลุ่มอุปกรณ์

ส่งไปยังอุปกรณ์แต่ละเครื่อง

คุณสามารถส่งผ่านลงทะเบียน token ไป sendToDevice() วิธีการในการส่งข้อความไปยังอุปกรณ์ที่:

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

sendToDevice() วิธีนี้ยังสามารถส่งข้อความแบบหลายผู้รับ (นั่นคือข้อความไปยังอุปกรณ์หลาย) โดยผ่านอาร์เรย์ของการลงทะเบียนสัญญาณแทนเพียงลงทะเบียนเพียงครั้งเดียวโทเค็น:

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

sendToDevice() วิธีการส่งกลับสัญญาที่มีการแก้ไขด้วยการเป็น MessagingDevicesResponse วัตถุที่มีการตอบสนองจาก FCM ชนิดส่งคืนมีรูปแบบเดียวกันเมื่อส่งโทเค็นการลงทะเบียนเดียวหรืออาร์เรย์ของโทเค็นการลงทะเบียน

บางกรณี เช่น ข้อผิดพลาดในการตรวจสอบสิทธิ์หรือการจำกัดอัตรา ทำให้ข้อความทั้งหมดไม่สามารถดำเนินการได้ ในกรณีเหล่านี้สัญญาที่ส่งกลับโดย sendToDevice() ถูกปฏิเสธกับข้อผิดพลาด สำหรับรายการเต็มรูปแบบของรหัสข้อผิดพลาดรวมทั้งรายละเอียดและขั้นตอนการแก้ดู ธุรการ FCM ข้อผิดพลาด API

ส่งไปยังกลุ่มอุปกรณ์

การส่งข้อความกลุ่มอุปกรณ์ช่วยให้คุณเพิ่มอุปกรณ์หลายเครื่องในกลุ่มเดียวได้ สิ่งนี้คล้ายกับการส่งข้อความตามหัวข้อ แต่รวมถึงการรับรองความถูกต้องเพื่อให้แน่ใจว่าการเป็นสมาชิกกลุ่มได้รับการจัดการโดยเซิร์ฟเวอร์ของคุณเท่านั้น ตัวอย่างเช่น หากคุณต้องการส่งข้อความที่แตกต่างกันไปยังโทรศัพท์รุ่นต่างๆ เซิร์ฟเวอร์ของคุณสามารถเพิ่ม/ลบการลงทะเบียนไปยังกลุ่มที่เหมาะสม และส่งข้อความที่เหมาะสมไปยังแต่ละกลุ่ม การส่งข้อความกลุ่มอุปกรณ์แตกต่างจากการส่งข้อความตามหัวข้อที่เกี่ยวข้องกับการจัดการกลุ่มอุปกรณ์จากเซิร์ฟเวอร์ของคุณ แทนที่จะใช้โดยตรงภายในแอปพลิเคชันของคุณ

คุณสามารถใช้การส่งข้อความผ่านทางกลุ่มอุปกรณ์เดิม XMPP หรือ HTTP โปรโตคอลบนเซิร์ฟเวอร์ของแอป Firebase ธุรการ SDK สำหรับ Node.js ขึ้นอยู่กับโปรโตคอลเดิมนอกจากนี้ยังมีความสามารถในการส่งข้อความกลุ่มอุปกรณ์ จำนวนสมาชิกสูงสุดที่อนุญาตสำหรับคีย์การแจ้งเตือนคือ 20

คุณสามารถสร้างกลุ่มอุปกรณ์และสร้างคีย์การแจ้งเตือนผ่านเซิร์ฟเวอร์แอปหรือไคลเอ็นต์ Android ดู ผู้จัดการกลุ่มอุปกรณ์ สำหรับรายละเอียด

sendToDeviceGroup() วิธีการช่วยให้คุณส่งข้อความไปยังกลุ่มอุปกรณ์โดยการระบุที่สำคัญการแจ้งเตือนสำหรับกลุ่มอุปกรณ์ที่:

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

sendToDeviceGroup() วิธีการส่งกลับสัญญาที่มีการแก้ไขด้วยการเป็น MessagingDeviceGroupResponse วัตถุที่มีการตอบสนองจาก FCM

บางกรณี เช่น ข้อผิดพลาดในการตรวจสอบสิทธิ์หรือการจำกัดอัตรา ทำให้ข้อความทั้งหมดไม่สามารถดำเนินการได้ ในกรณีเหล่านี้สัญญาที่ส่งกลับโดย sendToDeviceGroup() ถูกปฏิเสธกับข้อผิดพลาด สำหรับรายการเต็มรูปแบบของรหัสข้อผิดพลาดรวมทั้งรายละเอียดและขั้นตอนการแก้ดู ธุรการ FCM ข้อผิดพลาด API

การกำหนดเพย์โหลดข้อความ

วิธีการดังกล่าวข้างต้นขึ้นอยู่กับโปรโตคอล FCM เดิมรับน้ำหนักบรรทุกข้อความเป็นอาร์กิวเมนต์ที่สองของพวกเขาและการสนับสนุนทั้ง ข้อความแจ้งเตือนและข้อมูล คุณสามารถระบุประเภทหนึ่งหรือทั้งสองข้อความโดยการสร้างวัตถุกับ data และ / หรือ notification กุญแจ ตัวอย่างเช่น นี่คือวิธีกำหนดประเภทของ payloads ของข้อความ:

ข้อความแจ้งเตือน

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 ชั่วโมง:

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

ดูเอกสารอ้างอิงสำหรับ MessagingOptions สำหรับรายการเต็มรูปแบบของตัวเลือกที่ใช้ได้