Uygulama sunucusu gönderme istekleri oluşturma

Firebase Admin SDK veya FCM uygulama sunucusu protokollerini kullanarak mesaj istekleri oluşturabilir ve bunları aşağıdaki hedef türlerine gönderebilirsiniz:

  • Konu adı
  • Koşul
  • Cihaz kaydı jetonu
  • Cihaz grubu adı (yalnızca protokol)

Önceden tanımlanmış alanlardan oluşan bir bildirim yükü, kendi kullanıcı tanımlı alanlarınızın veri yükünü veya her iki yük türünü de içeren bir ileti gönderebilirsiniz. Daha fazla bilgi için Mesaj türleri bölümüne bakın.

Bu sayfadaki örneklerde, Firebase Admin SDK (Node, Java, Python, C# ve Go desteğine sahiptir) ve v1 HTTP protokolü kullanılarak bildirim mesajlarının nasıl gönderileceği gösterilmektedir. Desteği sonlandırılan eski HTTP ve XMPP protokolleri aracılığıyla mesaj göndermeyle ilgili de rehberlik sunulmaktadır.

Belirli cihazlara mesaj gönderme

Belirli bir cihaza göndermek için cihazın kayıt jetonunu gösterildiği gibi iletin. Kayıt jetonları hakkında daha fazla bilgi edinmek için platformunuzun istemci kurulum bilgilerine bakın.

Node.js

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

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

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

Java

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

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

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

Python

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

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

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

Go

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

REST

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

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

Her gönderim yöntemi, başarılı olduğunda bir ileti kimliği döndürür. Firebase Admin SDK, kimlik dizesini projects/{project_id}/messages/{message_id} biçiminde döndürür. HTTP protokol yanıtı tek bir JSON anahtarıdır:

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

Birden fazla cihaza mesaj gönderme

Yönetici FCM API'leri, bir mesajı cihaz kaydı jetonlarının listesine çoklu yayınlamanıza olanak tanır. Çağırma başına en fazla 500 cihaz kaydı jetonu belirtebilirsiniz.

Node.js

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

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

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

Java

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

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

Python

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

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

Go

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

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

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

C#

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

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

Döndürülen değer, giriş jetonlarının sırasına karşılık gelen bir jeton listesidir. Bu, hangi jetonların hataya neden olduğunu kontrol etmek istediğinizde kullanışlıdır.

Node.js

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

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

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

Java

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

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

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

Python

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

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

Go

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

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

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

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

C#

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

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

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

Konular için mesaj gönderme

İstemci uygulama örneklerini istemci tarafında konuya abone ederek veya sunucu API'si aracılığıyla bir konu oluşturduktan sonra konuya mesaj gönderebilirsiniz. FCM için gönderme isteği oluşturma işlemini ilk kez yapıyorsanız önemli arka plan ve kurulum bilgileri için sunucu ortamınız ve FCM ile ilgili kılavuzu inceleyin.

Arka uçtaki gönderim mantığınızda, istediğiniz konu adını aşağıdaki gibi belirtin:

Node.js

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

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

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

Java

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

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

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

Python

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

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

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

Go

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

REST

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

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

Bir kombinasyon konusuna mesaj göndermek için hedef konuları belirten bir mantıksal ifade olan bir koşul belirtin. Örneğin, aşağıdaki koşul TopicA ve TopicB veya TopicC'e abone olan cihazlara mesaj gönderir:

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

FCM önce parantez içindeki koşulları, ardından ifadeyi soldan sağa doğru değerlendirir. Yukarıdaki ifadede, herhangi bir konuya abone olan kullanıcılar mesajı almaz. Benzer şekilde, TopicA kanalına abone olmayan kullanıcılar da mesajı almaz. Aşağıdaki kombinasyonlar bu özelliği alır:

  • TopicA ve TopicB
  • TopicA ve TopicC

Koşullu ifadenize en fazla beş konu ekleyebilirsiniz.

Bir koşula göndermek için:

Node.js

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

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

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

Java

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

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

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

Python

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

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

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

Go

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

REST

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

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

Cihaz gruplarına mesaj gönderme

Cihaz gruplarına mesaj göndermek için HTTP v1 API'yi kullanın. Şu anda HTTP veya XMPP için desteği sonlandırılmış eski gönderme API'lerini ya da eski protokollere dayalı Node.js için Firebase Admin SDK'in eski sürümlerinden herhangi birini kullanarak cihaz gruplarına gönderim yapıyorsanız en kısa sürede HTTP v1 API'ye geçmenizi önemle tavsiye ederiz. Eski gönderme API'leri Haziran 2024'te devre dışı bırakılacak ve kaldırılacaktır.

Bir cihaz grubuna mesaj gönderme işlemi, gönderme isteklerini yetkilendirmek için aynı yöntemin kullanıldığı tek bir cihaza mesaj gönderme işlemine çok benzer. token alanını grup bildirim anahtarı olarak ayarlayın:

REST

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

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

{
   "message":{
      "token":"APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ",
      "data":{
        "hello": "This is a Firebase Cloud Messaging device group message!"
      }
   }
}

cURL komutu

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

Bir grup mesaj gönderme

Yönetici SDK'ları, iletilerin toplu olarak gönderilmesini destekler. 500 adede kadar mesajı tek bir grupta toplayabilir ve hepsini tek bir API çağrısında gönderebilirsiniz. Bu sayede, her mesaj için ayrı HTTP istekleri göndermeye kıyasla önemli bir performans artışı elde edebilirsiniz.

Bu özellik, özelleştirilmiş bir mesaj grubu oluşturmak ve bunları konular veya belirli cihaz kaydı jetonları dahil olmak üzere farklı alıcılara göndermek için kullanılabilir. Örneğin, mesaj gövdesinde biraz farklı ayrıntılar içeren mesajları farklı kitlelere aynı anda göndermeniz gerektiğinde bu özelliği kullanın.

Node.js

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

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

Java

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

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

Python

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

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

Go

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

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

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

C#

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

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

Doğrudan önyükleme özelliğini etkinleştiren mesajlar gönderme (yalnızca Android)

HTTP v1 veya eski HTTP API'lerini kullanarak doğrudan önyükleme modundaki cihazlara mesaj gönderebilirsiniz. Doğrudan önyükleme modundaki cihazlara göndermeden önce, istemci cihazların doğrudan önyükleme modunda FCM mesajları almasını sağlayan adımları tamamladığınızdan emin olun.

FCM v1 HTTP API'yi kullanarak gönderme

Mesaj isteği, istek metninin AndroidConfig seçeneklerinde "direct_boot_ok" : true anahtarını içermelidir. Örneğin:

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

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

FCM eski HTTP API'sini kullanarak gönderme

Mesaj isteği, istek metninin en üst düzeyinde "direct_boot_ok" : true anahtarını içermelidir. Örneğin:

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
}

İstek gövdesinde bu anahtarla gönderilen mesajlar, şu anda doğrudan önyükleme modunda olan cihazlardaki uygulamalar tarafından (ve bu modda olmasa bile) işlenebilir.

Platformlar arasında mesajları özelleştirme

Hem Firebase Admin SDK hem de FCM v1 HTTP protokolü, mesaj isteklerinizin message nesnesinde mevcut tüm alanları ayarlamasına izin verir. Bunlardan bazıları:

  • Mesajın alındığı tüm uygulama örnekleri tarafından yorumlanacak ortak bir alan grubu.
  • AndroidConfig ve WebpushConfig gibi platforma özel alan kümeleri, yalnızca belirtilen platformda çalışan uygulama örnekleri tarafından yorumlanır.

Platforma özel engeller, mesajların alındığında doğru şekilde ele alınmasını sağlamak için farklı platformlar için özelleştirme esnekliği sunar. FCM arka ucu, belirtilen tüm parametreleri dikkate alır ve mesajı her platform için özelleştirir.

Ortak alanlar ne zaman kullanılır?

Aşağıdaki durumlarda ortak alanları kullanın:

  • Apple, Android ve web dahil tüm platformlarda uygulama örneklerini hedefleme
  • Konular için mesaj gönderme

Platformdan bağımsız olarak tüm uygulama örnekleri aşağıdaki ortak alanları yorumlayabilir:

Platforma özgü alanlar ne zaman kullanılır?

Aşağıdaki işlemleri yapmak istiyorsanız platforma özgü alanları kullanın:

  • Alanları yalnızca belirli platformlara gönderme
  • Ortak alanlara ek olarak platforma özgü alanları gönderme

Yalnızca belirli platformlara değer göndermek istediğinizde ortak alanları kullanmayın, platforma özgü alanları kullanın. Örneğin, yalnızca Apple platformlarına ve web'e, Android'e değil bildirim göndermek için biri Apple, diğeri web için olmak üzere iki ayrı alan grubu kullanmanız gerekir.

Belirli dağıtım seçenekleri içeren iletiler gönderirken bunları ayarlamak için platforma özgü alanları kullanın. İsterseniz platform başına farklı değerler belirtebilirsiniz. Ancak platformlar arasında temelde aynı değeri ayarlamak istediğinizde bile platforma özgü alanları kullanmanız gerekir. Bunun nedeni, her platformun değeri biraz farklı şekilde yorumlayabilmesidir. Örneğin, Android'de ömrü sona erme süresi saniye cinsinden son kullanma süresi olarak ayarlanırken Apple'da son kullanma tarihi olarak ayarlanır.

Örnek: Renk ve simge seçenekleri içeren bildirim mesajı

Bu örnek gönderim isteği, tüm platformlara ortak bir bildirim başlığı ve içeriği gönderir ancak Android cihazlara platforma özel bazı geçersiz kılma işlemleri de gönderir.

Android için istek, Android cihazlarda gösterilecek özel bir simge ve renk ayarlar. AndroidNotification referansında belirtildiği gibi, renk #rrggbb biçiminde belirtilir ve resim, Android uygulamasına yerel bir çizilebilir simge kaynağı olmalıdır.

Kullanıcının cihazındaki görsel efektin yaklaşık görünümü aşağıda verilmiştir:

Birinde özel simge ve renk gösterilen iki cihazın basit çizimi

Node.js

const topicName = 'industry-tech';

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

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

Java

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

Python

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

Go

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

REST

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

Mesaj gövdesinde platforma özgü bloklarda kullanılabilen anahtarlarla ilgili tüm ayrıntılar için HTTP v1 referans dokümanlarına bakın.

Örnek: Özel resim içeren bildirim mesajı

Aşağıdaki örnek gönderim isteği, tüm platformlara ortak bir bildirim başlığı gönderir ancak bir resim de gönderir. Kullanıcının cihazındaki görsel etkinin yaklaşık bir görünümünü aşağıda bulabilirsiniz:

Görüntülü bildirimdeki basit bir resim çizimi

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

REST

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

Mesaj gövdesinde platforma özgü bloklarda kullanılabilen anahtarlarla ilgili tüm ayrıntılar için HTTP v1 referans dokümanlarına bakın.

Örnek: İlişkili bir tıklama işlemi içeren bildirim mesajı

Aşağıdaki örnek gönderme isteği, tüm platformlara ortak bir bildirim başlığı gönderir ancak kullanıcının bildirimle etkileşime geçmesine yanıt olarak uygulamanın gerçekleştirmesi için bir işlem de gönderir. Kullanıcının cihazındaki görsel efektin yaklaşık görünümü aşağıda verilmiştir:

Bir kullanıcının dokunarak web sayfası açtığı basit çizim

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

REST

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

Mesaj gövdesinde platforma özgü bloklarda kullanılabilen anahtarlarla ilgili tüm ayrıntılar için HTTP v1 referans dokümanlarına bakın.

Örnek: yerelleştirme seçenekleri içeren bildirim mesajı

Aşağıdaki örnek gönderme isteği, istemcinin yerelleştirilmiş mesajlar göstermesi için yerelleştirme seçeneklerini gönderir. Kullanıcının cihazındaki görsel efektin yaklaşık görünümü aşağıda verilmiştir:

İngilizce ve İspanyolca metinlerin gösterildiği iki cihazın basit çizimi

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

REST

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

Mesaj gövdesinde platforma özgü bloklarda kullanılabilen anahtarlarla ilgili tüm ayrıntılar için HTTP v1 referans dokümanlarına bakın.

HTTP v1 API için REST hata kodları

HTTP v1 API için HTTP hata yanıtları bir hata kodu, hata mesajı ve hata durumu içerir. Ayrıca, hata hakkında daha fazla ayrıntı içeren bir details dizisi de içerebilirler.

Aşağıda iki örnek hata yanıtı verilmiştir:

1. örnek: Veri mesajında geçersiz bir değer içeren HTTP v1 API isteğinde hata yanıtı

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

2. örnek: Geçersiz kayıt jetonu içeren bir HTTP v1 API isteğinden gelen hata yanıtı

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

Her iki mesajın da aynı koda ve duruma sahip olduğunu ancak details dizisinin farklı türde değerler içerdiğini unutmayın. İlk örnekte, istek değerlerinde hata olduğunu belirten type.googleapis.com/google.rpc.BadRequest türü vardır. type.googleapis.com/google.firebase.fcm.v1.FcmError türüne sahip ikinci örnekte FCM'ye özgü bir hata vardır. Birçok hata için ayrıntılar dizisi, hata ayıklama ve çözüm bulmak için ihtiyacınız olan bilgileri içerir.

Aşağıdaki tabloda FCM v1 REST API hata kodları ve açıklamaları listelenmiştir.

Hata Kodu Açıklama ve Çözüm Adımları
UNSPECIFIED_ERROR Bu hata hakkında daha fazla bilgi yok. Yok.
INVALID_ARGUMENT (HTTP hata kodu = 400) İstek parametreleri geçersiz. Hangi alanın geçersiz olduğunu belirtmek için google.rpc.BadRequest türündeki bir uzantı döndürülür. Geçersiz kayıt, geçersiz paket adı, mesaj çok büyük, geçersiz veri anahtarı, geçersiz TTL veya diğer geçersiz parametreler olası nedenler arasındadır.
Geçersiz kayıt: Sunucuya ilettiğiniz kayıt jetonunun biçimini kontrol edin. Bu değerin, istemci uygulamasının FCM'ye kaydolurken aldığı kayıt jetonuyla eşleştiğinden emin olun. Jetonu kısaltmayın veya başka karakterler eklemeyin.
Geçersiz paket adı: Mesajın, paket adı istekte iletilen değerle eşleşen bir kayıt jetonuna yönlendirildiğinden emin olun.
İleti çok büyük: Bir iletiye eklenen yük verilerinin toplam boyutunun FCM sınırlarını aşmadığından emin olun: Çoğu ileti için 4096 bayt veya konulara gönderilen iletiler için 2048 bayt. Buna hem anahtarlar hem de değerler dahildir.
Geçersiz veri anahtarı: Yük verisinin, FCM tarafından dahili olarak kullanılan bir anahtar (ör. from, gcm veya google öneki eklenmiş herhangi bir değer) içermediğinden emin olun. Bazı kelimelerin (ör. collapse_key) FCM tarafından da kullanıldığını ancak yükte kullanılmasına izin verildiğini unutmayın. Bu durumda yük değeri, FCM değeri tarafından geçersiz kılınır.
Geçersiz TTL: ttl alanında kullanılan değerin, 0 ile 2.419.200 (4 hafta) saniye arasında bir süreyi temsil eden bir tam sayı olduğundan emin olun.
Geçersiz parametreler: Sağlanan parametrelerin doğru ada ve türe sahip olup olmadığını kontrol edin.
UNREGISTERED (HTTP hata kodu = 404) Uygulama örneğinin FCM'den kaydı silindi. Bu genellikle kullanılan jetonun artık geçerli olmadığı ve yeni bir jetonun kullanılması gerektiği anlamına gelir. Bu hata, eksik kayıt jetonlarından veya kayıtlı olmayan jetonlardan kaynaklanabilir.
Kayıt eksik: İletinin hedefi bir token değeriyse isteğin kayıt jetonu içerdiğinden emin olun.
Kayıtlı değil: Mevcut bir kayıt jetonu, aşağıdakiler de dahil olmak üzere çeşitli senaryolarda geçerliliğini yitirebilir:
- İstemci uygulamasının FCM'de kaydı silinirse.
- İstemci uygulamasının otomatik olarak kaydı silinmişse (kullanıcı uygulamayı kaldırırsa bu durumla karşılaşılabilir). Örneğin, iOS'te APNs Geri Bildirim Hizmeti, APNs jetonunu geçersiz olarak bildirdiyse.
- Kayıt jetonunun süresi dolarsa (örneğin, Google kayıt jetonlarını yenilemeye karar verebilir veya iOS cihazlar için APNs jetonunun süresi dolmuştur).
- İstemci uygulaması güncellenmişse ancak yeni sürüm mesaj alacak şekilde yapılandırılmamışsa.
Tüm bu durumlarda, bu kayıt jetonunu uygulama sunucusundan kaldırın ve mesaj göndermek için kullanmayı bırakın.
SENDER_ID_MISMATCH (HTTP hata kodu = 403) Kimliği doğrulanmış gönderen kimliği, kayıt jetonunun gönderen kimliğinden farklı. Kayıt jetonu belirli bir gönderen grubuna bağlıdır. Bir istemci uygulaması FCM'ye kaydolurken hangi gönderenlerin mesaj göndermesine izin verildiğini belirtmelidir. İstemci uygulamasına mesaj gönderirken bu gönderen kimliklerinden birini kullanmanız gerekir. Farklı bir gönderene geçerseniz mevcut kayıt jetonları çalışmaz.
QUOTA_EXCEEDED (HTTP hata kodu = 429) İleti hedefi için gönderim sınırı aşıldı. Hangi kotanın aşıldığını belirtmek için google.rpc.QuotaFailure türündeki bir uzantı döndürülür. Bu hata, mesaj oranı kotasının aşılması, cihaz mesaj oranı kotasının aşılması veya konu mesaj oranı kotasının aşılması nedeniyle oluşabilir.
Mesaj oranı aşıldı: Mesaj gönderme oranı çok yüksek. Mesaj gönderme hızınızı genel olarak azaltmanız gerekir. Reddedilen iletileri yeniden denemek için en az 1 dakikalık başlangıç gecikmesiyle üstel geri yükleme kullanın.
Cihaz mesaj oranı aşıldı: Belirli bir cihaza gönderilen mesajların oranı çok yüksek. Tek bir cihaza mesaj gönderme hızı sınırıbaşlıklı makaleyi inceleyin. Bu cihaza gönderilen mesaj sayısını azaltın ve göndermeyi yeniden denemek için eksponansiyel geri yüklemeyi kullanın.
Konu mesajı oranı aşıldı: Belirli bir konuya abone olan kullanıcılara gönderilen mesajların oranı çok yüksek. Bu konu için gönderilen mesaj sayısını azaltın ve göndermeyi yeniden denemek için en az 1 dakikalık başlangıç gecikmesiyle üstel geri yükleme kullanın.
UNAVAILABLE (HTTP hata kodu = 503) Sunucu aşırı yük altında. Sunucu, isteği zamanında işleyemedi. Aynı isteği yeniden deneyin ancak şunu yapmanız gerekir:
- FCM Bağlantı Sunucusu'ndan gelen yanıtta Retry-After üstbilgisi varsa bu üstbilgiyi dikkate alın.
- Yeniden deneme mekanizmanıza eksponansiyel geri yükleme uygulayın. (ör. ilk yeniden denemeden önce bir saniye beklediyseniz sonraki denemeden önce en az iki saniye, ardından 4 saniye bekleyin). Birden fazla mesaj gönderiyorsanız jitter uygulamayı düşünebilirsiniz. Daha fazla bilgi için Yeniden denemelerin ele alınması başlıklı makaleyi inceleyin. Sorunlara neden olan gönderenler, engellenmeye tabi tutulabilir.
INTERNAL (HTTP hata kodu = 500) Bilinmeyen dahili bir hata oluştu. Sunucu, isteği işlemeye çalışırken bir hatayla karşılaştı. Yeniden denemelerin ele alınması bölümündeki önerileri uygulayarak aynı isteği yeniden deneyebilirsiniz. Hata devam ederse lütfen Firebase Destek Ekibi ile iletişime geçin.
THIRD_PARTY_AUTH_ERROR (HTTP hata kodu = 401) APNs sertifikası veya web push kimlik doğrulama anahtarı geçersiz ya da eksikti. iOS cihazı hedefleyen bir mesaj veya web push kaydı gönderilemedi. Geliştirme ve üretim kimlik bilgilerinizin geçerliliğini kontrol edin.

Yönetici hata kodları

Aşağıdaki tabloda, Firebase Yöneticisi FCM API hata kodları ve önerilen çözüm adımları da dahil olmak üzere açıklamaları listelenmiştir.

Hata Kodu Açıklama ve Çözüm Adımları
messaging/invalid-argument Bir FCM yöntemine geçersiz bir bağımsız değişken sağlandı. Hata mesajında ek bilgiler bulunmalıdır.
messaging/invalid-recipient Amaçlanan mesaj alıcısı geçersiz. Hata mesajında ek bilgiler bulunmalıdır.
messaging/invalid-payload Geçersiz bir mesaj yükü nesnesi sağlandı. Hata mesajında ek bilgiler bulunmalıdır.
messaging/invalid-data-payload-key Veri mesajı yükü geçersiz bir anahtar içeriyor. Kısıtlanmış anahtarlar için DataMessagePayload referans dokümanlarını inceleyin.
messaging/payload-size-limit-exceeded Sağlanan mesaj yükü, FCM boyut sınırlarını aşıyor. Çoğu mesaj için sınır 4.096 bayttır. Konulara gönderilen mesajlar için sınır 2.048 bayttır. Toplam yükü boyutu hem anahtarları hem de değerleri içerir.
messaging/invalid-options Geçersiz bir mesaj seçenekleri nesnesi sağlandı. Hata mesajında ek bilgiler bulunmalıdır.
messaging/invalid-registration-token Geçersiz kayıt jetonu sağlandı. İstemci uygulamasının FCM'e kaydolurken aldığı kayıt jetonuyla eşleştiğinden emin olun. Kısaltmayın veya ek karakter eklemeyin.
messaging/registration-token-not-registered Sağlanan kayıt jetonu kayıtlı değil. Daha önce geçerli olan bir kayıt teriminin kaydı, aşağıdakiler dahil olmak üzere çeşitli nedenlerle silinebilir:
  • İstemci uygulaması, FCM'te kaydını iptal etti.
  • İstemci uygulamasının kaydı otomatik olarak silindi. Bu durum, kullanıcı uygulamayı kaldırırsa veya Apple platformlarında APNs Geri Bildirim Hizmeti, APNs jetonunu geçersiz olarak bildiriyorsa ortaya çıkabilir.
  • Kayıt jetonunun süresi doldu. Örneğin, Google kayıt jetonlarını yenilemeye karar verebilir veya Apple cihazlarda APNs jetonunun süresi dolmuş olabilir.
  • İstemci uygulaması güncellendi ancak yeni sürüm, mesaj alacak şekilde yapılandırılmış değil.
Tüm bu durumlarda bu kayıt jetonunu kaldırın ve mesaj göndermek için kullanmayı bırakın.
messaging/invalid-package-name İleti, paket adı sağlanan restrictedPackageName seçeneğiyle eşleşmeyen bir kayıt jetonuna gönderildi.
messaging/message-rate-exceeded Belirli bir hedefe gönderilen mesajların oranı çok yüksek. Bu cihaza veya konuya gönderilen mesaj sayısını azaltın ve bu hedefe hemen göndermeyi tekrar denemeyin.
messaging/device-message-rate-exceeded Belirli bir cihaza gönderilen mesajların oranı çok yüksek. Bu cihaza gönderilen mesajların sayısını azaltın ve bu cihaza hemen tekrar göndermeyi denemeyin.
messaging/topics-message-rate-exceeded Belirli bir konuya abone olan kullanıcılara gönderilen mesajların oranı çok yüksek. Bu konu için gönderilen mesajların sayısını azaltın ve hemen bu konuya mesaj göndermeyi tekrar denemeyin.
messaging/too-many-topics Kayıt jetonu maksimum konu sayısına abone oldu ve başka bir konuya abone edilemiyor.
messaging/invalid-apns-credentials Gerekli APNs SSL sertifikası yüklenmediği veya geçerlilik süresi dolduğu için Apple cihazı hedefleyen bir ileti gönderilemedi. Geliştirme ve üretim sertifikalarınızın geçerliliğini kontrol edin.
messaging/mismatched-credential Bu SDK'nın kimliğini doğrulamak için kullanılan kimlik bilgisinin, sağlanan kayıt jetonuna karşılık gelen cihaza mesaj gönderme izni yok. Kimlik bilgisinin ve kayıt jetonunun aynı Firebase projesine ait olduğundan emin olun. Firebase Admin SDK kimliklerinin nasıl doğrulanacağıyla ilgili dokümanlar için Firebase'i uygulamanıza ekleme başlıklı makaleyi inceleyin.
messaging/authentication-error SDK, FCM sunucularında kimlik doğrulayamadı. Firebase Admin SDK kimlik doğrulamasını, FCM mesajları göndermek için gerekli izinlere sahip bir kimlik bilgisiyle yaptığınızdan emin olun. Firebase Admin SDK kimliklerinin nasıl doğrulanacağıyla ilgili dokümanlar için Firebase'i uygulamanıza ekleme başlıklı makaleyi inceleyin.
messaging/server-unavailable FCM sunucusu isteği zamanında işleyemedi. Aynı isteği tekrar denemeniz gerekir ancak şunu yapmanız gerekir:
  • FCM Bağlantı Sunucusu'ndan gelen yanıta dahil edilmişse Retry-After üst bilgisini dikkate alın.
  • Yeniden deneme mekanizmanıza eksponansiyel geri yükleme uygulayın. Örneğin, ilk yeniden denemeden önce bir saniye beklediyseniz sonraki denemeden önce en az iki saniye, ardından dört saniye bekleyin. Birden fazla mesaj gönderiyorsanız tüm mesajlar için aynı anda yeni bir istek göndermemek amacıyla her bir mesajı bağımsız olarak ek bir rastgele süreyle erteleyin.
Sorunlara neden olan gönderenler kara listeye alınabilir.
messaging/internal-error FCM sunucusu, isteği işlemeye çalışırken bir hatayla karşılaştı. Yukarıdaki messaging/server-unavailable satırında listelenen koşulları uygulayarak aynı isteği tekrar deneyebilirsiniz. Hata devam ederse lütfen sorunu Hata Bildirimi destek kanalımıza bildirin.
messaging/unknown-error Bilinmeyen bir sunucu hatası döndürüldü. Daha fazla ayrıntı için hata mesajındaki ham sunucu yanıtına bakın. Bu hatayı alırsanız lütfen hata mesajının tamamını Hata Bildirimi destek kanalımıza bildirin.

Eski uygulama sunucusu protokollerini kullanarak mesaj gönderme

Şu anda eski protokolleri kullanıyorsanız mesaj isteklerini bu bölümde gösterildiği gibi oluşturun. HTTP üzerinden birden fazla platforma gönderim yapıyorsanız v1 protokolünün mesaj isteklerinizi büyük ölçüde basitleştirebileceğini unutmayın.

Belirli cihazlara mesaj gönderme

Belirli cihazlara mesaj göndermek için to anahtarını, belirli uygulama örneğinin kayıt jetonuna ayarlayın. Kayıt jetonları hakkında daha fazla bilgi edinmek için platformunuzun istemci kurulum bilgilerine bakın.

HTTP POST isteği

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 yanıtı

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

XMPP mesajı

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

XMPP yanıtı

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

XMPP bağlantı sunucusu, yanıtlar için başka seçenekler de sunar. Sunucu yanıtı biçimi bölümüne bakın.

İstemci uygulamalarına yayın mesajları gönderirken kullanılabilen mesaj seçeneklerinin tam listesi için seçtiğiniz bağlantı sunucusu protokolü ( HTTP veya XMPP) ile ilgili referans bilgilerine bakın.

Konular için mesaj gönderme

Firebase Cloud Messaging konusuna mesaj gönderme, tek bir cihaza veya kullanıcı grubuna mesaj göndermeye çok benzer. Uygulama sunucusu, to anahtarını /topics/yourTopic gibi bir değerle ayarlar. Geliştiriciler, normal ifadeyle eşleşen herhangi bir konu adını seçebilir: "/topics/[a-zA-Z0-9-_.~%]+".

Birden fazla konunun kombinasyonuna göndermek için uygulama sunucusunun condition anahtarını (to anahtarı yerine) hedef konuları belirten bir Boole koşuluna ayarlaması gerekir. Örneğin, TopicA ve TopicB ya da TopicC'e abone olan cihazlara mesaj göndermek için:

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

FCM önce parantez içindeki tüm koşulları, ardından ifadeyi soldan sağa doğru değerlendirir. Yukarıdaki ifadede, tek bir konuya abone olan kullanıcılar mesajı almaz. Benzer şekilde, KonuA'ya abone olmayan bir kullanıcı da iletiyi almaz. Aşağıdaki kombinasyonlar bu özelliği alır:

  • KonuA ve KonuB
  • KonuA ve KonuC

Koşullu ifadenize en fazla beş konu ekleyebilirsiniz. Köşeli parantezler desteklenir. Desteklenen operatörler: &&, ||.

Konu HTTP POST isteği

Tek bir konuya gönderme:

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

"Köpekler" veya "Kediler" konularına abone olan cihazlara gönderme:

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

Konu HTTP yanıtı

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

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

Konu XMPP mesajı

Tek bir konuya gönderme:

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


  </gcm>
</message>

"Köpekler" veya "Kediler" konularına abone olan cihazlara gönderme:

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


  </gcm>
</message>

Konu XMPP yanıtı

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

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

FCM sunucusunun, konu gönderme isteklerine başarılı veya başarısız yanıt vermeden önce 30 saniyeye kadar gecikme yaşanması beklenir. İstekte uygulama sunucusunun zaman aşımı değerini buna göre ayarladığınızdan emin olun.

Cihaz gruplarına mesaj gönderme

Desteği sonlandırılan eski API'leri kullanarak bir cihaz grubuna mesaj göndermek, tek bir cihaza mesaj göndermeye çok benzer. to parametresini, cihaz grubunun benzersiz bildirim anahtarına ayarlayın. Bu bölümdeki örneklerde, eski HTTP ve XMPP protokollerinde cihaz gruplarına veri mesajlarının nasıl gönderileceği gösterilmektedir.

Cihaz Grubu HTTP POST İsteği

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

Cihaz Grubu HTTP Yanıtı

Aşağıda "success" değerine sahip bir örnek verilmiştir. notification_key ile ilişkili 2 kayıt jetonu vardır ve mesaj her ikisine de başarıyla gönderilmiştir:

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

Aşağıda, "kısmi başarı" örneği verilmiştir. notification_key ile ilişkili 3 kayıt jetonu vardır. İleti yalnızca kayıt jetonlarından birine başarıyla gönderildi. Yanıt mesajında, iletiyi alamayan kayıt jetonları (registration_ids) listelenir:

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

Bir ileti, notification_key ile ilişkili kayıt belirteçlerinden birine veya daha fazlasına gönderilemezse uygulama sunucusu, yeniden denemelerde bekleme süresi uygulayarak yeniden denemelidir.

Sunucu, üyesi olmayan bir cihaz grubuna mesaj göndermeye çalışırsa yanıt, 0 başarılı ve 0 başarısız sonuçla aşağıdaki gibi görünür:

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

Cihaz Grubu XMPP Mesajı

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

Cihaz Grubu XMPP Yanıtı

Mesaj, gruptaki cihazlardan birine başarıyla gönderildiğinde XMPP bağlantı sunucusu bir ACK ile yanıt verir. Gruptaki tüm cihazlara gönderilen tüm mesajlar başarısız olursa XMPP bağlantı sunucusu NACK ile yanıt verir.

Aşağıda "success" değerine sahip bir örnek verilmiştir. notification_key ile ilişkili 3 kayıt jetonu vardır ve mesaj bunların hepsine başarıyla gönderilmiştir:

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

Aşağıda, "kısmi başarı" örneği verilmiştir. notification_key ile ilişkili 3 kayıt jetonu vardır. İleti yalnızca kayıt jetonlarından birine başarıyla gönderildi. Yanıt mesajında, iletiyi alamayan kayıt jetonları listelenir:

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

FCM bağlantı sunucusu gruptaki tüm cihazlara yayın yapamadığında Uygulama sunucusu, reddetme yanıtı alır.

Mesaj seçeneklerinin tam listesi için seçtiğiniz bağlantı sunucusu protokolü (HTTP veya XMPP) ile ilgili referans bilgilerine bakın.

Firebase Admin SDK eski gönderme yöntemleri

Firebase Admin Node.js SDK'sı, eski FCM sunucu API'sini temel alan mesaj gönderme (FCM) yöntemlerini destekler. Bu yöntemler, send() yöntemine kıyasla farklı bağımsız değişkenleri kabul eder. Mümkün olduğunda send() yöntemini kullanmalısınız ve yalnızca tek cihazlara veya cihaz gruplarına mesaj gönderirken bu sayfada açıklanan yöntemleri kullanmalısınız.

Ayrı ayrı cihazlara gönderme

Bir cihaza mesaj göndermek için sendToDevice() yöntemine kayıt jetonu iletebilirsiniz:

Node.js

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

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

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

sendToDevice() yöntemi, tek bir kayıt jetonu yerine bir kayıt jetonu dizisi ileterek çoklu yayın mesajı (yani birden fazla cihaza gönderilen bir mesaj) da gönderebilir:

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);
  });
başarısız olur.

sendToDevice() yöntemi, FCM'ten gelen yanıtı içeren bir MessagingDevicesResponse nesnesi ile çözülen bir promise döndürür. Tek bir kayıt jetonu veya kayıt jetonu dizisi iletirken döndürülen tür aynı biçime sahiptir.

Kimlik doğrulama hatası veya hız sınırlaması gibi bazı durumlar, iletilerin tamamının işlenememesi sonucuna yol açar. Bu durumlarda, sendToDevice() tarafından döndürülen söz bir hatayla reddedilir. Açıklamalar ve çözüm adımları dahil olmak üzere hata kodlarının tam listesi için Admin FCM API Hataları başlıklı makaleyi inceleyin.

Bir cihaz grubuna gönderme

sendToDeviceGroup() yöntemi, bir cihaz grubunun bildirim anahtarını belirterek söz konusu cihaz grubuna mesaj göndermenize olanak tanır:

Node.js

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

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

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

sendToDeviceGroup() yöntemi, FCM'ten gelen yanıtı içeren bir MessagingDevicesResponse nesnesi ile çözülen bir promise döndürür.

Kimlik doğrulama hatası veya hız sınırlaması gibi bazı durumlar, iletilerin tamamının işlenememesi sonucuna yol açar. Bu durumlarda, sendToDeviceGroup() tarafından döndürülen söz bir hatayla reddedilir. Açıklamalar ve çözüm adımları dahil olmak üzere hata kodlarının tam listesi için Admin FCM API Hataları başlıklı makaleyi inceleyin.

Mesaj yükü tanımlama

FCM eski protokollerine dayalı yukarıdaki yöntemler, ikinci bağımsız değişken olarak bir mesaj yükü kabul eder ve hem bildirim hem de veri mesajlarını destekler. data ve / veya notification anahtarlarını içeren bir nesne oluşturarak mesaj türlerinden birini veya ikisini belirtebilirsiniz. Örneğin, farklı mesaj yükü türlerini tanımlama işlemi aşağıdaki gibidir:

Bildirim mesajı

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

Veri mesajı

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

Birleştirilmiş mesaj

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

Bildirim mesajı yük verileri, önceden tanımlanmış bir geçerli özellik alt kümesine sahiptir ve hedeflediğiniz mobil işletim sistemine bağlı olarak biraz farklılık gösterir. Tam liste için NotificationMessagePayload referans dokümanlarına bakın.

Veri mesajı yükü, tüm değerlerin dize olması gerektiği gibi birkaç kısıtlamaya sahip özel anahtar/değer çiftlerinden oluşur. Kısıtlamaların tam listesi için DataMessagePayload referans dokümanlarına bakın.

Mesaj seçeneklerini tanımlama

FCM eski protokollerine dayalı yukarıdaki yöntemler, ileti için bazı seçenekleri belirten isteğe bağlı üçüncü bir bağımsız değişkeni kabul eder. Örneğin, aşağıdaki örnekte bir cihaza 24 saat sonra süresi dolacak yüksek öncelikli bir mesaj gönderilmektedir:

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

Kullanılabilir seçeneklerin tam listesi için MessagingOptions referans dokümanlarına bakın.