Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Bangun permintaan pengiriman server aplikasi

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Dengan menggunakan protokol server aplikasi Firebase Admin SDK atau FCM, Anda dapat membuat permintaan pesan dan mengirimkannya ke jenis target berikut:

  • Nama topik
  • Kondisi
  • Token pendaftaran perangkat
  • Nama grup perangkat (protokol lama dan Firebase Admin SDK hanya untuk Node.js)

Anda dapat mengirim pesan dengan muatan notifikasi yang terdiri dari bidang yang telah ditentukan sebelumnya, muatan data dari bidang yang ditentukan pengguna Anda sendiri, atau pesan yang berisi kedua jenis muatan. Lihat Jenis pesan untuk informasi lebih lanjut.

Contoh di halaman ini menunjukkan cara mengirim pesan notifikasi menggunakan Firebase Admin SDK (yang mendukung Node , Java , Python , C# , dan Go ) dan protokol HTTP v1 . Ada juga panduan untuk mengirim pesan melalui protokol HTTP dan XMPP lama .

Kirim pesan ke perangkat tertentu

Untuk mengirim ke satu perangkat tertentu, berikan token pendaftaran perangkat seperti yang ditunjukkan. Lihat informasi penyiapan klien untuk platform Anda guna mempelajari lebih lanjut tentang token pendaftaran.

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

Jawa

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

Piton

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

Pergi

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

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

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

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

C#

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

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

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

ISTIRAHAT

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

perintah 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

Jika berhasil, setiap metode pengiriman mengembalikan ID pesan. Firebase Admin SDK mengembalikan string ID dalam format projects/{project_id}/messages/{message_id} . Respons protokol HTTP adalah satu kunci JSON:

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

Kirim pesan ke beberapa perangkat

REST API dan Admin FCM API memungkinkan Anda melakukan multicast pesan ke daftar token pendaftaran perangkat. Anda dapat menentukan hingga 500 token pendaftaran perangkat per pemanggilan.

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

Jawa

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

Piton

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

Pergi

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

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

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

C#

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

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

ISTIRAHAT

Buat permintaan batch HTTP:

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

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

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

...

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

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

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

Simpan permintaan ke dalam file (dalam contoh ini batch_request.txt). Kemudian gunakan perintah cURL:

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

Untuk Firebase Admin SDK, operasi ini menggunakan API sendAll() di bawah tenda, seperti yang ditunjukkan pada contoh. Nilai yang dikembalikan adalah BatchResponse yang daftar responsnya sesuai dengan urutan token input. Ini berguna saat Anda ingin memeriksa token mana yang menyebabkan kesalahan.

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

Jawa

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

Piton

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

Pergi

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

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

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

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

C#

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

var response = await FirebaseMessaging.DefaultInstance.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}");
}

ISTIRAHAT

Setiap kirim sub-kirim mengembalikan respons. Respons dipisahkan oleh string batas respons yang dimulai dengan --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--

Kirim pesan ke topik

Setelah Anda membuat topik, baik dengan berlangganan instance aplikasi klien ke topik di sisi klien atau melalui API server , Anda dapat mengirim pesan ke topik tersebut. Jika ini pertama kalinya Anda membuat permintaan pengiriman untuk FCM, lihat panduan untuk lingkungan server dan FCM Anda untuk informasi latar belakang dan penyiapan yang penting.

Dalam logika pengiriman Anda di backend, tentukan nama topik yang diinginkan seperti yang ditunjukkan:

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

Jawa

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

Piton

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

Pergi

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

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

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

C#

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

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

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

ISTIRAHAT

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

perintah 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

Untuk mengirim pesan ke kombinasi topik, tentukan kondisi , yang merupakan ekspresi boolean yang menentukan topik target. Misalnya, kondisi berikut akan mengirim pesan ke perangkat yang berlangganan TopicA dan TopicB atau TopicC :

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

FCM terlebih dahulu mengevaluasi kondisi apa pun dalam tanda kurung, lalu mengevaluasi ekspresi dari kiri ke kanan. Dalam ekspresi di atas, pengguna yang berlangganan topik tunggal mana pun tidak menerima pesan. Demikian pula, pengguna yang tidak berlangganan TopicA tidak akan menerima pesan tersebut. Kombinasi ini memang menerimanya:

  • TopicA dan TopicB
  • TopicA dan TopicC

Anda dapat menyertakan hingga lima topik dalam ekspresi bersyarat Anda.

Untuk mengirim ke kondisi:

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

Jawa

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

Piton

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

Pergi

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

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

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

C#

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

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

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

ISTIRAHAT

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

perintah 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

Kirim sekumpulan pesan

REST API dan Admin SDK mendukung pengiriman pesan secara berkelompok. Anda dapat mengelompokkan hingga 500 pesan ke dalam satu kumpulan dan mengirim semuanya dalam satu panggilan API, dengan peningkatan kinerja yang signifikan dibandingkan pengiriman permintaan HTTP terpisah untuk setiap pesan.

Fitur ini dapat digunakan untuk membuat kumpulan pesan yang disesuaikan dan mengirimkannya ke penerima yang berbeda, termasuk topik atau token pendaftaran perangkat tertentu. Gunakan fitur ini saat, misalnya, Anda perlu mengirim pesan secara bersamaan ke audiens yang berbeda dengan detail yang sedikit berbeda di badan pesan.

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

Jawa

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

Piton

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

Pergi

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

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

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

C#

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

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

ISTIRAHAT

Buat permintaan batch HTTP dengan menggabungkan daftar sub permintaan:

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

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

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

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

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

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

...

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

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

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

Anda dapat BatchResponse yang dikembalikan untuk memeriksa berapa banyak pesan yang berhasil diteruskan ke FCM. Itu juga memperlihatkan daftar tanggapan yang dapat digunakan untuk memeriksa keadaan masing-masing pesan. Urutan tanggapan sesuai dengan urutan pesan dalam daftar masukan.

Kirim pesan langsung yang mengaktifkan boot (khusus Android)

Anda dapat mengirim pesan ke perangkat dalam mode boot langsung menggunakan HTTP v1 atau HTTP API lama. Sebelum mengirim ke perangkat dalam mode boot langsung, pastikan Anda telah menyelesaikan langkah-langkah untuk mengaktifkan perangkat klien untuk menerima pesan FCM dalam mode boot langsung .

Kirim menggunakan FCM v1 HTTP API

Permintaan pesan harus menyertakan kunci "direct_boot_ok" : true di opsi AndroidConfig dari isi permintaan. Sebagai contoh:

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

Kirim menggunakan FCM HTTP API lama

Permintaan pesan harus menyertakan kunci "direct_boot_ok" : true di tingkat atas badan permintaan. Sebagai contoh:

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
}

Pesan yang dikirim dengan kunci ini di badan permintaan dapat ditangani oleh aplikasi pada perangkat yang saat ini dalam mode boot langsung (dan juga saat tidak dalam mode tersebut).

Sesuaikan pesan di seluruh platform

Firebase Admin SDK dan protokol HTTP FCM v1 memungkinkan permintaan pesan Anda menyetel semua kolom yang tersedia di objek message . Ini termasuk:

  • kumpulan bidang umum untuk ditafsirkan oleh semua instance aplikasi yang menerima pesan.
  • kumpulan bidang khusus platform, seperti AndroidConfig dan WebpushConfig , hanya ditafsirkan oleh instance aplikasi yang berjalan pada platform yang ditentukan.

Pemblokiran khusus platform memberi Anda fleksibilitas untuk menyesuaikan pesan untuk platform yang berbeda guna memastikan bahwa pesan tersebut ditangani dengan benar saat diterima. Backend FCM akan mempertimbangkan semua parameter yang ditentukan dan menyesuaikan pesan untuk setiap platform.

Kapan harus menggunakan kolom umum

Gunakan kolom umum saat Anda:

  • Menargetkan instance aplikasi di semua platform — Apple, Android, dan web
  • Mengirim pesan ke topik

Semua instance aplikasi, apa pun platformnya, dapat menginterpretasikan kolom umum berikut:

Kapan harus menggunakan bidang khusus platform

Gunakan bidang khusus platform saat Anda ingin:

  • Kirim bidang hanya ke platform tertentu
  • Kirim bidang khusus platform selain bidang umum

Setiap kali Anda ingin mengirim nilai hanya ke platform tertentu, jangan gunakan kolom umum; gunakan bidang khusus platform. Misalnya, untuk mengirim pemberitahuan hanya ke platform dan web Apple tetapi tidak ke Android, Anda harus menggunakan dua kumpulan bidang yang terpisah, satu untuk Apple dan satu lagi untuk web.

Saat Anda mengirim pesan dengan opsi pengiriman tertentu , gunakan bidang khusus platform untuk menyetelnya. Anda dapat menentukan nilai yang berbeda per platform jika Anda mau. Namun, meskipun Anda ingin menyetel nilai yang pada dasarnya sama di seluruh platform, Anda harus menggunakan bidang khusus platform. Hal ini karena setiap platform mungkin menginterpretasikan nilainya sedikit berbeda—misalnya, time-to-live disetel di Android sebagai waktu kedaluwarsa dalam hitungan detik, sedangkan di Apple disetel sebagai tanggal kedaluwarsa .

Contoh: pesan notifikasi dengan opsi warna dan ikon

Permintaan pengiriman contoh ini mengirimkan judul dan konten notifikasi umum ke semua platform, tetapi juga mengirimkan beberapa penggantian khusus platform ke perangkat Android.

Untuk Android, permintaan menetapkan ikon dan warna khusus untuk ditampilkan di perangkat Android. Seperti disebutkan dalam referensi untuk AndroidNotification , warna ditentukan dalam format #rrggbb, dan gambar harus merupakan sumber daya ikon yang dapat digambar yang bersifat lokal untuk aplikasi Android.

Berikut perkiraan efek visual pada perangkat pengguna:

Gambar sederhana dari dua perangkat, dengan satu menampilkan ikon dan warna khusus

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

Jawa

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

Piton

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

Pergi

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

C#

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

ISTIRAHAT

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

Lihat dokumentasi referensi HTTP v1 untuk detail lengkap tentang kunci yang tersedia di blok khusus platform di badan pesan.

Contoh: pesan notifikasi dengan gambar kustom

Contoh permintaan kirim berikut mengirimkan judul pemberitahuan umum ke semua platform, tetapi juga mengirimkan gambar. Berikut perkiraan efek visual pada perangkat pengguna:

Gambar sederhana dari sebuah gambar dalam sebuah tampilan notifikasi

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

ISTIRAHAT

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

Lihat dokumentasi referensi HTTP v1 untuk detail lengkap tentang kunci yang tersedia di blok khusus platform di badan pesan.

Contoh: pesan notifikasi dengan tindakan klik terkait

Contoh permintaan kirim berikut mengirimkan judul notifikasi umum ke semua platform, tetapi juga mengirimkan tindakan untuk dilakukan aplikasi sebagai respons terhadap interaksi pengguna dengan notifikasi. Berikut perkiraan efek visual pada perangkat pengguna:

Gambar sederhana dari ketukan pengguna membuka halaman web

Node.js

const topicName = 'industry-tech';

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

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

ISTIRAHAT

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

Lihat dokumentasi referensi HTTP v1 untuk detail lengkap tentang kunci yang tersedia di blok khusus platform di badan pesan.

Contoh: pesan notifikasi dengan opsi pelokalan

Contoh berikut mengirim permintaan mengirim opsi pelokalan bagi klien untuk menampilkan pesan yang dilokalkan. Berikut perkiraan efek visual pada perangkat pengguna:

Gambar sederhana dari dua perangkat yang menampilkan teks dalam bahasa Inggris dan Spanyol

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

ISTIRAHAT

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

Lihat dokumentasi referensi HTTP v1 untuk detail lengkap tentang kunci yang tersedia di blok khusus platform di badan pesan.

Kode kesalahan admin

Tabel berikut mencantumkan kode error Firebase Admin FCM API dan deskripsinya, termasuk langkah-langkah resolusi yang direkomendasikan.

Kode Kesalahan Deskripsi dan Langkah-Langkah Penyelesaian
messaging/invalid-argument Argumen yang tidak valid diberikan ke metode FCM. Pesan kesalahan harus berisi informasi tambahan.
messaging/invalid-recipient Penerima pesan yang dituju tidak valid. Pesan kesalahan harus berisi informasi tambahan.
messaging/invalid-payload Objek payload pesan yang tidak valid disediakan. Pesan kesalahan harus berisi informasi tambahan.
messaging/invalid-data-payload-key Payload pesan data berisi kunci yang tidak valid. Lihat dokumentasi referensi untuk DataMessagePayload untuk kunci yang dibatasi.
messaging/payload-size-limit-exceeded Payload pesan yang diberikan melebihi batas ukuran FCM. Batasnya adalah 4096 byte untuk sebagian besar pesan. Untuk pesan yang dikirim ke topik, batasnya adalah 2048 byte. Ukuran muatan total mencakup kunci dan nilai.
messaging/invalid-options Objek opsi pesan yang tidak valid disediakan. Pesan kesalahan harus berisi informasi tambahan.
messaging/invalid-registration-token Token pendaftaran yang diberikan tidak valid. Pastikan itu cocok dengan token pendaftaran yang diterima aplikasi klien dari mendaftar dengan FCM. Jangan memotong atau menambahkan karakter tambahan ke dalamnya.
messaging/registration-token-not-registered Token pendaftaran yang diberikan tidak terdaftar. Token pendaftaran yang sebelumnya valid dapat dibatalkan pendaftarannya karena berbagai alasan, termasuk:
  • Aplikasi klien membatalkan pendaftarannya sendiri dari FCM.
  • Aplikasi klien dibatalkan pendaftarannya secara otomatis. Hal ini dapat terjadi jika pengguna menghapus instalan aplikasi atau, pada platform Apple, jika Layanan Umpan Balik APN melaporkan token APN sebagai tidak valid.
  • Token pendaftaran kedaluwarsa. Misalnya, Google mungkin memutuskan untuk menyegarkan token pendaftaran atau token APN mungkin telah kedaluwarsa untuk perangkat Apple.
  • Aplikasi klien telah diperbarui, tetapi versi baru tidak dikonfigurasi untuk menerima pesan.
Untuk semua kasus ini, hapus token pendaftaran ini dan hentikan penggunaannya untuk mengirim pesan.
messaging/invalid-package-name Pesan tersebut dialamatkan ke token pendaftaran yang nama paketnya tidak cocok dengan opsi restrictedPackageName yang disediakan.
messaging/message-rate-exceeded Tingkat pesan ke target tertentu terlalu tinggi. Kurangi jumlah pesan yang dikirim ke perangkat atau topik ini dan jangan langsung mencoba mengirim ulang ke target ini.
messaging/device-message-rate-exceeded Tingkat pesan ke perangkat tertentu terlalu tinggi. Kurangi jumlah pesan yang dikirim ke perangkat ini dan jangan langsung mencoba mengirim ulang ke perangkat ini.
messaging/topics-message-rate-exceeded Tingkat pesan ke pelanggan untuk topik tertentu terlalu tinggi. Kurangi jumlah pesan yang dikirim untuk topik ini, dan jangan langsung mencoba mengirim ulang ke topik ini.
messaging/too-many-topics Token pendaftaran telah berlangganan ke jumlah maksimum topik dan tidak dapat berlangganan lagi.
messaging/invalid-apns-credentials Pesan yang ditargetkan ke perangkat Apple tidak dapat dikirim karena sertifikat SSL APN yang diperlukan tidak diunggah atau telah kedaluwarsa. Periksa validitas sertifikat pengembangan dan produksi Anda.
messaging/mismatched-credential Kredensial yang digunakan untuk mengautentikasi SDK ini tidak memiliki izin untuk mengirim pesan ke perangkat yang sesuai dengan token pendaftaran yang disediakan. Pastikan kredensial dan token pendaftaran keduanya milik proyek Firebase yang sama. Lihat Menambahkan Firebase ke aplikasi Anda untuk dokumentasi tentang cara mengautentikasi Firebase Admin SDK.
messaging/authentication-error SDK tidak dapat mengautentikasi ke server FCM. Pastikan Anda mengautentikasi Firebase Admin SDK dengan kredensial yang memiliki izin yang sesuai untuk mengirim pesan FCM. Lihat Menambahkan Firebase ke aplikasi Anda untuk dokumentasi tentang cara mengautentikasi Firebase Admin SDK.
messaging/server-unavailable Server FCM tidak dapat memproses permintaan tepat waktu. Anda harus mencoba lagi permintaan yang sama, tetapi Anda harus:
  • Hormati header Retry-After jika disertakan dalam respons dari FCM Connection Server.
  • Terapkan back-off eksponensial dalam mekanisme coba ulang Anda. Misalnya, jika Anda menunggu satu detik sebelum percobaan pertama, tunggu setidaknya dua detik sebelum percobaan berikutnya, lalu empat detik, dan seterusnya. Jika Anda mengirim beberapa pesan, tunda setiap pesan secara terpisah dengan jumlah acak tambahan untuk menghindari mengeluarkan permintaan baru untuk semua pesan secara bersamaan.
Pengirim yang menyebabkan masalah berisiko masuk daftar hitam.
messaging/internal-error Server FCM mengalami kesalahan saat mencoba memproses permintaan. Anda dapat mencoba kembali permintaan yang sama dengan mengikuti persyaratan yang tercantum di baris messaging/server-unavailable di atas. Jika kesalahan berlanjut, harap laporkan masalah tersebut ke saluran dukungan Laporan Bug kami.
messaging/unknown-error Kesalahan server yang tidak diketahui dikembalikan. Lihat respons server mentah dalam pesan kesalahan untuk lebih jelasnya. Jika Anda menerima kesalahan ini, harap laporkan pesan kesalahan lengkap ke saluran dukungan Laporan Bug kami.

Kirim pesan menggunakan protokol server aplikasi lama

Jika Anda lebih suka menggunakan protokol lawas, buat permintaan pesan seperti yang ditunjukkan di bagian ini. Perlu diingat bahwa, jika Anda mengirim ke beberapa platform melalui HTTP, protokol v1 dapat menyederhanakan permintaan pesan Anda.

Kirim pesan ke perangkat tertentu

Untuk mengirim pesan ke perangkat tertentu, setel kunci to ke token pendaftaran untuk instance aplikasi tertentu. Lihat informasi penyiapan klien untuk platform Anda guna mempelajari lebih lanjut tentang token pendaftaran.

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

Respons HTTP

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

pesan XMPP

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

tanggapan XMPP

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

Server koneksi XMPP menyediakan beberapa opsi lain untuk respons. Lihat Format tanggapan server .

Untuk daftar lengkap opsi pesan yang tersedia saat mengirim pesan downstream ke aplikasi klien, lihat informasi referensi untuk protokol server koneksi pilihan Anda, HTTP atau XMPP .

Kirim pesan ke topik

Mengirim pesan ke topik Firebase Cloud Messaging sangat mirip dengan mengirim pesan ke perangkat individual atau ke grup pengguna. Server aplikasi menetapkan kunci to dengan nilai seperti /topics/yourTopic . Pengembang dapat memilih nama topik apa pun yang cocok dengan ekspresi reguler: "/topics/[a-zA-Z0-9-_.~%]+" .

Untuk mengirim ke kombinasi beberapa topik, server aplikasi harus menyetel kunci condition (bukan kunci to ) ke kondisi boolean yang menentukan topik target. Misalnya, untuk mengirim pesan ke perangkat yang berlangganan TopicA dan TopicB atau TopicC :

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

FCM terlebih dahulu mengevaluasi kondisi apa pun dalam tanda kurung, lalu mengevaluasi ekspresi dari kiri ke kanan. Dalam ekspresi di atas, pengguna yang berlangganan topik tunggal mana pun tidak menerima pesan. Demikian pula, pengguna yang tidak berlangganan TopicA tidak akan menerima pesan tersebut. Kombinasi ini memang menerimanya:

  • TopikA dan TopikB
  • TopikA dan TopikC

Anda dapat menyertakan hingga lima topik dalam ekspresi bersyarat, dan tanda kurung didukung. Operator yang didukung: && , || .

Permintaan HTTP POST topik

Kirim ke satu topik:

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


Kirim ke perangkat yang berlangganan topik "anjing" atau "kucing":

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


Tanggapan HTTP topik

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

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

Pesan XMPP topik

Kirim ke satu topik:

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


  </gcm>
</message>

Kirim ke perangkat yang berlangganan topik "anjing" atau "kucing":

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


  </gcm>
</message>

Tanggapan XMPP topik

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

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

Harapkan penundaan hingga 30 detik sebelum Server FCM mengembalikan respons sukses atau gagal ke permintaan pengiriman topik. Pastikan untuk menyetel nilai batas waktu server aplikasi dalam permintaan yang sesuai.

Kirim pesan ke grup perangkat

Mengirim pesan ke grup perangkat sangat mirip dengan mengirim pesan ke satu perangkat. Setel to parameter ke kunci notifikasi unik untuk grup perangkat. Lihat Jenis pesan untuk detail tentang dukungan payload. Contoh di halaman ini menunjukkan cara mengirim pesan data ke grup perangkat dalam protokol HTTP dan XMPP lama.

Permintaan HTTP POST Grup Perangkat

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

Respons HTTP Grup Perangkat

Berikut adalah contoh "berhasil"— notification_key memiliki 2 token pendaftaran yang terkait dengannya, dan pesan berhasil dikirim ke keduanya:

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

Berikut adalah contoh "berhasil sebagian" — notification_key memiliki 3 token pendaftaran yang terkait dengannya. Pesan berhasil dikirim hanya ke 1 token pendaftaran. Pesan respons mencantumkan token pendaftaran ( registration_ids ) yang gagal menerima pesan:

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

Saat pesan gagal dikirim ke satu atau beberapa token pendaftaran yang terkait dengan notification_key , server aplikasi harus mencoba lagi dengan mundur di antara percobaan ulang.

Jika server mencoba mengirim pesan ke grup perangkat yang tidak memiliki anggota, responsnya terlihat seperti berikut, dengan 0 keberhasilan dan 0 kegagalan:

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

Pesan XMPP Grup Perangkat

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

Respons XMPP Grup Perangkat

Ketika pesan berhasil dikirim ke salah satu perangkat dalam grup, server koneksi XMPP merespons dengan ACK. Jika semua pesan yang dikirim ke semua perangkat dalam grup gagal, server koneksi XMPP merespons dengan NACK.

Berikut adalah contoh "sukses" — notification_key memiliki 3 token pendaftaran yang terkait dengannya, dan pesan berhasil dikirim ke semuanya:

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

Berikut adalah contoh "berhasil sebagian" — notification_key memiliki 3 token pendaftaran yang terkait dengannya. Pesan berhasil dikirim hanya ke 1 token pendaftaran. Pesan respons mencantumkan token pendaftaran yang gagal menerima pesan:

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

Saat server koneksi FCM gagal mengirim ke semua perangkat dalam grup. Server aplikasi akan menerima respons nack.

Untuk daftar lengkap opsi pesan, lihat informasi referensi untuk protokol server koneksi pilihan Anda, HTTP atau XMPP .

Metode pengiriman lama Firebase Admin SDK

Firebase Admin Node.js SDK mendukung metode pengiriman pesan (FCM) berdasarkan API server FCM Lama . Metode ini menerima argumen yang berbeda dibandingkan dengan metode send() . Anda harus menggunakan metode send() jika memungkinkan, dan hanya menggunakan metode yang dijelaskan di halaman ini saat mengirim pesan ke perangkat individual atau grup perangkat.

Kirim ke perangkat individual

Anda bisa meneruskan token pendaftaran ke metode sendToDevice() untuk mengirim pesan ke perangkat itu:

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

Metode sendToDevice() juga dapat mengirim pesan multicast (yaitu, pesan ke beberapa perangkat) dengan meneruskan array token pendaftaran, bukan hanya satu token pendaftaran:

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

Metode sendToDevice() menampilkan promise yang diselesaikan dengan objek MessagingDevicesResponse yang berisi respons dari FCM. Jenis pengembalian memiliki format yang sama saat meneruskan satu token pendaftaran atau larik token pendaftaran.

Beberapa kasus seperti kesalahan autentikasi atau pembatasan kecepatan menyebabkan keseluruhan pesan gagal diproses. Dalam kasus ini, janji yang dikembalikan oleh sendToDevice() ditolak dengan kesalahan. Untuk daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, lihat Admin FCM API Errors .

Kirim ke grup perangkat

Perpesanan grup perangkat memungkinkan Anda menambahkan beberapa perangkat ke satu grup. Ini mirip dengan perpesanan topik, tetapi menyertakan autentikasi untuk memastikan bahwa keanggotaan grup hanya dikelola oleh server Anda. Misalnya, jika Anda ingin mengirim pesan yang berbeda ke model telepon yang berbeda, server Anda dapat menambah/menghapus pendaftaran ke grup yang sesuai dan mengirim pesan yang sesuai ke setiap grup. Perpesanan grup perangkat berbeda dari perpesanan topik karena melibatkan pengelolaan grup perangkat dari server Anda, bukan langsung di dalam aplikasi Anda.

Anda dapat menggunakan perpesanan grup perangkat melalui protokol XMPP atau HTTP lama di server aplikasi Anda. Versi lama Firebase Admin SDK untuk Node.js didasarkan pada protokol lama dan juga menyediakan kemampuan perpesanan grup perangkat. Jumlah maksimum anggota yang diizinkan untuk kunci notifikasi adalah 20.

Anda dapat membuat grup perangkat dan membuat kunci notifikasi melalui server aplikasi atau klien Android. Lihat Mengelola grup perangkat untuk detailnya.

Metode sendToDeviceGroup() memungkinkan Anda mengirim pesan ke grup perangkat dengan menentukan kunci notifikasi untuk grup perangkat tersebut:

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

Metode sendToDeviceGroup() menampilkan promise yang diselesaikan dengan objek MessagingDevicesResponse yang berisi respons dari FCM.

Beberapa kasus seperti kesalahan autentikasi atau pembatasan kecepatan menyebabkan keseluruhan pesan gagal diproses. Dalam kasus ini, janji yang dikembalikan oleh sendToDeviceGroup() ditolak dengan kesalahan. Untuk daftar lengkap kode error, termasuk deskripsi dan langkah penyelesaian, lihat Admin FCM API Errors .

Menentukan payload pesan

Metode di atas berdasarkan protokol lama FCM menerima payload pesan sebagai argumen kedua dan mendukung pesan notifikasi dan data . Anda dapat menentukan satu atau kedua jenis pesan dengan membuat objek dengan kunci data dan/atau notification . Misalnya, berikut adalah cara menentukan berbagai jenis payload pesan:

Pesan pemberitahuan

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

Pesan data

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

Pesan gabungan

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

Payload pesan notifikasi memiliki subset properti valid yang ditentukan sebelumnya dan sedikit berbeda bergantung pada sistem operasi seluler mana yang Anda targetkan. Lihat dokumen referensi untuk NotificationMessagePayload untuk daftar lengkapnya.

Muatan pesan data terdiri dari pasangan nilai kunci khusus dengan beberapa batasan, termasuk fakta bahwa semua nilai harus berupa string. Lihat dokumen referensi untuk DataMessagePayload untuk daftar lengkap batasan.

Menentukan pilihan pesan

Metode di atas berdasarkan protokol lama FCM menerima argumen ketiga opsional yang menentukan beberapa opsi untuk pesan. Misalnya, contoh berikut mengirimkan pesan berprioritas tinggi ke perangkat yang kedaluwarsa setelah 24 jam:

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

Lihat dokumen referensi untuk MessagingOptions untuk daftar lengkap opsi yang tersedia.