Google มุ่งมั่นที่จะพัฒนาความเท่าเทียมทางเชื้อชาติสำหรับชุมชนคนผิวดำ มาดูกันว่า
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

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

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

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

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

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

Node.js

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

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

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

ชวา

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

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

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

หลาม

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

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

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

ไป

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

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

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

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

ค#

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

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

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

ส่วนที่เหลือ

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

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

คำสั่ง cURL:

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

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

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

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

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

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

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

ชวา

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

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

หลาม

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

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

ไป

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

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

ชวา

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

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

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

หลาม

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

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

ไป

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

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

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

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

Node.js

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

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

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

ชวา

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

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

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

หลาม

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

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

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

ไป

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

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

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

ค#

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

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

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

ส่วนที่เหลือ

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

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

คำสั่ง cURL:

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

ในการส่งข้อความไปยัง ชุดค่าผสม ของหัวข้อให้ระบุ เงื่อนไข ซึ่งเป็นนิพจน์บูลีนที่ระบุหัวข้อเป้าหมาย ยกตัวอย่างเช่นเงื่อนไขต่อไปนี้จะส่งข้อความไปยังอุปกรณ์ที่สมัครเป็นสมาชิก 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.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = {
  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.
admin.messaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });
 

ชวา

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

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

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

หลาม

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

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

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

ไป

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

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

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

ค#

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

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

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

ส่วนที่เหลือ

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

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

คำสั่ง cURL:

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

ส่งชุดข้อความ

REST API และ 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',
});

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

ชวา

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

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

หลาม

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

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

ไป

 // Create a list containing up to 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 100 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_book_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_book_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_book_ok" : true
}
 

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

ปรับแต่งข้อความข้ามแพลตฟอร์ม

Firebase Admin SDK และโปรโตคอล FCM v1 HTTP ทั้งคู่อนุญาตให้คำขอข้อความของคุณตั้งค่าฟิลด์ทั้งหมดที่มีอยู่ในวัตถุ message รวมถึง:

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ตั้งเวลาใช้งานนานสำหรับ Android พร้อมกับไอคอนและสีพิเศษเพื่อแสดงบนอุปกรณ์ Android
  • ตั้งค่าฟิลด์ badge iOS เท่านั้นในเพย์โหลด APN สำหรับส่งไปยังอุปกรณ์ iOS

Node.js

 var message = {
  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: {
    ttl: 3600 * 1000,
    notification: {
      icon: 'stock_ticker_update',
      color: '#f45342',
    },
  },
  apns: {
    payload: {
      aps: {
        badge: 42,
      },
    },
  },
  topic: 'industry-tech'
};
 

ชวา

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

หลาม

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

ไป

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

ค#

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

ส่วนที่เหลือ

 {
  "message":{
     "topic":"industry-tech",
     "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":{
       "ttl":"3600s",
       "notification":{
         "icon":"stock_ticker_update",
         "color":"#f45342"
       }
     },
     "apns":{
       "payload":{
         "aps":{
           "badge":"42"
         }
       }
     },
     "webpush":{
       "headers":{
         "TTL":"86400"
       }
     }
   }
 }
 

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

รหัสข้อผิดพลาดของผู้ดูแลระบบ

ตารางต่อไปนี้แสดงรหัสข้อผิดพลาด FireCM Admin FCM API และคำอธิบายรวมถึงขั้นตอนการแก้ปัญหาที่แนะนำ

รหัสข้อผิดพลาด รายละเอียดและขั้นตอนการแก้ไขปัญหา
messaging/invalid-argument มีการระบุอาร์กิวเมนต์ที่ไม่ถูกต้องให้กับวิธีการ FCM ข้อความแสดงข้อผิดพลาดควรมีข้อมูลเพิ่มเติม
messaging/invalid-recipient ผู้รับข้อความที่ต้องการไม่ถูกต้อง ข้อความแสดงข้อผิดพลาดควรมีข้อมูลเพิ่มเติม
messaging/invalid-payload มีการจัดหาวัตถุเพย์โหลดข้อความที่ไม่ถูกต้อง ข้อความแสดงข้อผิดพลาดควรมีข้อมูลเพิ่มเติม
messaging/invalid-data-payload-key เพย์โหลดข้อความข้อมูลมีรหัสที่ไม่ถูกต้อง ดูเอกสารอ้างอิงสำหรับ DataMessagePayload สำหรับกุญแจที่ถูก จำกัด
messaging/payload-size-limit-exceeded ส่วนของข้อความที่ให้เกินขนาด จำกัด ของ FCM ขีด จำกัด คือ 4096 ไบต์สำหรับข้อความส่วนใหญ่ สำหรับข้อความที่ส่งถึงหัวข้อขีด จำกัด คือ 2048 ไบต์ ขนาดส่วนของข้อมูลรวมทั้งหมดมีทั้งคีย์และค่า
messaging/invalid-options มีการระบุวัตถุตัวเลือกข้อความที่ไม่ถูกต้อง ข้อความแสดงข้อผิดพลาดควรมีข้อมูลเพิ่มเติม
messaging/invalid-registration-token โทเค็นการลงทะเบียนที่ระบุไม่ถูกต้อง ตรวจสอบให้แน่ใจว่าตรงกับโทเค็นการลงทะเบียนที่แอปไคลเอ็นต์ได้รับจากการลงทะเบียนด้วย FCM อย่าตัดหรือเพิ่มตัวอักษรเพิ่มเติม
messaging/registration-token-not-registered โทเค็นการลงทะเบียนที่ระบุไม่ได้ลงทะเบียน โทเค็นการลงทะเบียนที่ถูกต้องก่อนหน้านี้สามารถยกเลิกการลงทะเบียนได้ด้วยเหตุผลหลายประการรวมถึง:
  • แอปไคลเอ็นต์ไม่ได้ลงทะเบียนจาก FCM
  • แอปไคลเอ็นต์ไม่ได้ลงทะเบียนโดยอัตโนมัติ สิ่งนี้อาจเกิดขึ้นได้หากผู้ใช้ถอนการติดตั้งแอปพลิเคชันหรือบน iOS หากบริการข้อเสนอแนะ APNS รายงานโทเค็น APNS ว่าไม่ถูกต้อง
  • โทเค็นการลงทะเบียนหมดอายุแล้ว ตัวอย่างเช่น Google อาจตัดสินใจรีเฟรชโทเค็นการลงทะเบียนหรือโทเค็น APNS อาจหมดอายุสำหรับอุปกรณ์ 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 ได้เนื่องจากใบรับรอง SSL APN ที่ต้องการไม่ได้อัปโหลดหรือหมดอายุ ตรวจสอบความถูกต้องของใบรับรองการพัฒนาและการผลิตของคุณ
messaging/mismatched-credential ข้อมูลประจำตัวที่ใช้ในการตรวจสอบสิทธิ์ SDK นี้ไม่ได้รับอนุญาตให้ส่งข้อความไปยังอุปกรณ์ที่สอดคล้องกับโทเค็นการลงทะเบียนที่ให้ไว้ ตรวจสอบให้แน่ใจว่าโทเค็นการรับรองและการลงทะเบียนทั้งคู่เป็นของโครงการ Firebase เดียวกัน ดูที่การ เพิ่ม Firebase ลงในแอพของคุณ สำหรับเอกสารเกี่ยวกับวิธีการตรวจสอบสิทธิ์ SDK ของ Firebase Admin
messaging/authentication-error SDK ไม่สามารถตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ FCM ตรวจสอบให้แน่ใจว่าคุณรับรองความถูกต้องของ Firebase Admin SDK ด้วยข้อมูลประจำตัวที่มีสิทธิ์ที่เหมาะสมในการส่งข้อความ FCM ดูที่การ เพิ่ม Firebase ลงในแอพของคุณ สำหรับเอกสารเกี่ยวกับวิธีการตรวจสอบสิทธิ์ SDK ของ Firebase Admin
messaging/server-unavailable เซิร์ฟเวอร์ FCM ไม่สามารถดำเนินการตามกำหนดเวลาได้ คุณควรลองคำขอเดิมอีกครั้ง แต่คุณต้อง:
  • ให้เกียรติกับส่วนหัว Retry-After ถ้ามันรวมอยู่ในการตอบสนองจากเซิร์ฟเวอร์การเชื่อมต่อ FCM
  • ใช้การอธิบายแบบย้อนกลับในกลไกการลองใหม่ของคุณ ตัวอย่างเช่นหากคุณรอหนึ่งวินาทีก่อนที่จะลองครั้งแรกให้รออย่างน้อยสองวินาทีก่อนหน้าหนึ่งต่อไปจากนั้นรอสี่วินาทีและต่อไปเรื่อย ๆ หากคุณกำลังส่งข้อความหลายข้อความให้เลื่อนแต่ละข้อความออกโดยอิสระด้วยจำนวนสุ่มเพิ่มเติมเพื่อหลีกเลี่ยงการออกคำขอใหม่สำหรับข้อความทั้งหมดในเวลาเดียวกัน
ผู้ส่งที่ทำให้เกิดปัญหาความเสี่ยงถูกขึ้นบัญชีดำ
messaging/internal-error เซิร์ฟเวอร์ FCM พบข้อผิดพลาดขณะพยายามประมวลผลคำขอ คุณสามารถลองคำขอเดียวกันโดยทำตามข้อกำหนดที่ระบุไว้ในแถว messaging/server-unavailable ด้านบน หากข้อผิดพลาดยังคงมีอยู่โปรดรายงานปัญหาไปยังช่องทางการสนับสนุน Bug Report ของเรา
messaging/unknown-error ข้อผิดพลาดเซิร์ฟเวอร์ที่ไม่รู้จักถูกส่งคืน ดูการตอบกลับของเซิร์ฟเวอร์ raw ในข้อความแสดงข้อผิดพลาด หากคุณได้รับข้อผิดพลาดนี้โปรดรายงานข้อความแสดงข้อผิดพลาดแบบเต็มไปยังช่องทางการสนับสนุน Bug Report ของเรา

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

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

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

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

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

  • หัวข้อ A และ TopicB
  • หัวข้อ A และ TopicC

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

!('TopicA' in topics)

ด้วยนิพจน์นี้อินสแตนซ์ของแอปใด ๆ ที่ไม่ได้สมัครเป็นสมาชิกของ TopicA รวมถึงอินสแตนซ์ของแอปที่ไม่ได้สมัครรับหัวข้อใด ๆ จะได้รับข้อความ

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

หัวข้อคำขอ 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 จะส่งคืนการตอบสนองต่อความสำเร็จหรือความล้มเหลวของคำขอการส่งหัวข้อ ตรวจสอบให้แน่ใจว่าตั้งค่าการหมดเวลาของเซิร์ฟเวอร์แอปในคำขอตามนั้น

สำหรับรายการตัวเลือกข้อความทั้งหมดดูข้อมูลอ้างอิงสำหรับโปรโตคอลเซิร์ฟเวอร์การเชื่อมต่อที่คุณเลือก HTTP หรือ XMPP

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

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

คำขอ HTTP POST ของกลุ่มอุปกรณ์

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

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

การตอบสนอง HTTP กลุ่มอุปกรณ์

นี่คือตัวอย่างของ "ความสำเร็จ" - notification_key มีโทเค็นการลงทะเบียน 2 อันที่เกี่ยวข้องและข้อความถูกส่งไปยังทั้งสองสำเร็จแล้ว:

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

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

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

เมื่อข้อความล้มเหลวในการส่งไปยังโทเค็นการลงทะเบียนอย่างน้อยหนึ่งรายการที่เชื่อมโยงกับ notification_key เซิร์ฟเวอร์แอปควรลองใหม่ด้วย backoff ระหว่างการลองใหม่

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

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

ข้อความกลุ่ม XMPP

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

การตอบสนองกลุ่มอุปกรณ์ XMPP

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

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

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

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

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

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

สำหรับรายการตัวเลือกข้อความทั้งหมดดูข้อมูลอ้างอิงสำหรับโปรโตคอลเซิร์ฟเวอร์การเชื่อมต่อที่คุณเลือก HTTP หรือ XMPP

วิธีส่งมรดกของ Firebase Admin SDK

Firebase Admin Node.js SDK รองรับวิธีการส่งข้อความ (FCM) ตาม Legacy FCM เซิร์ฟเวอร์ API วิธีการเหล่านี้ยอมรับข้อโต้แย้งที่แตกต่างเมื่อเทียบกับวิธีการ send() คุณควรใช้เมธอด send() ทุกครั้งที่ทำได้และใช้เฉพาะวิธีที่อธิบายไว้ในหน้านี้เมื่อส่งข้อความไปยังอุปกรณ์หรือกลุ่มอุปกรณ์แต่ละรายการ

ส่งไปยังอุปกรณ์แต่ละชิ้น

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

Node.js

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

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

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

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

Node.js

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

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

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

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

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

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

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

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

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

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

Node.js

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

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

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

sendToDeviceGroup() ส่งคืนสัญญาที่ได้รับการแก้ไขด้วยวัตถุ MessagingDeviceGroupResponse ที่มีการตอบสนองจาก FCM

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

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

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

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

 var payload = {
  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.'
  }
};
 

ข้อความข้อมูล

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

ข้อความรวม

 var payload = {
  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.'
  },
  data: {
    stock: 'GOOG',
    open: '829.62',
    close: '635.67'
  }
};
 

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

ส่วนของข้อมูลข้อความประกอบด้วยคู่ของคีย์ - ค่าแบบกำหนดเองที่มีข้อ จำกัด เล็กน้อยรวมถึงข้อเท็จจริงที่ว่าค่าทั้งหมดต้องเป็นสตริง ดูเอกสารอ้างอิงสำหรับ DataMessagePayload สำหรับรายการข้อ จำกัด ทั้งหมด

การกำหนดตัวเลือกข้อความ

วิธีการข้างต้นที่ยึดตามโปรโตคอลดั้งเดิมของ FCM ยอมรับอาร์กิวเมนต์ตัวเลือกที่สามซึ่งระบุตัวเลือกบางอย่างสำหรับข้อความ ตัวอย่างเช่นตัวอย่างต่อไปนี้ส่งข้อความลำดับความสำคัญสูงไปยังอุปกรณ์ที่หมดอายุหลังจาก 24 ชั่วโมง:

Node.js

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

// See the "Defining the message payload" section above for details
// on how to define a message payload.
var 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.
var options = {
  priority: 'high',
  timeToLive: 60 * 60 * 24
};

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

ดูเอกสารอ้างอิงสำหรับ MessagingOptions สำหรับรายการตัวเลือกที่มีทั้งหมด