إنشاء طلبات من خادم التطبيق لإنشاء طلبات

باستخدام بروتوكولات خادم التطبيقات Firebase Admin SDK أو FCM، يمكنك إنشاء طلبات رسائل وإرسالها إلى الأنواع التالية من الأهداف:

  • اسم الموضوع
  • الشرط
  • الرمز المميّز لتسجيل الجهاز
  • اسم مجموعة الأجهزة (البروتوكول فقط)

يمكنك إرسال الرسائل مع تكوين حمولة الإشعارات من الحقول المحددة مسبقًا أو حمولة بيانات الحقول التي يحددها المستخدم أو تحتوي على كلا النوعين من الحمولة. عرض أنواع الرسائل لمزيد من المعلومات.

توضح الأمثلة في هذه الصفحة كيفية إرسال رسائل الإشعارات باستخدام Firebase Admin SDK (التي تدعم عقدة، Java، Python، C#، أو انتقال) وانقر على الإصدار 1 من بروتوكول HTTP. هناك أيضًا إرشادات لإرسال الرسائل عن طريق بروتوكولات HTTP وXMPP القديمة.

إرسال رسائل إلى أجهزة محدّدة

لإرسال الرمز إلى جهاز واحد محدّد، عليك ضبط الرمز المميّز لتسجيل الجهاز كما هو موضح. يمكنك الاطّلاع على معلومات إعداد البرنامج للنظام الأساسي الذي تستخدمه للحصول على المزيد من المعلومات حول الرموز المميزة للتسجيل.

Node.js

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

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

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

جافا

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

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

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

Python

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

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

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

انتقال

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

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

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

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

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

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

عند إتمام الإجراء بنجاح، تعرض كل طريقة إرسال معرّف الرسالة. تعرض Firebase Admin SDK سلسلة المعرّف بالتنسيق projects/{project_id}/messages/{message_id}. استجابة بروتوكول HTTP هي مفتاح JSON واحد:

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

إرسال رسائل إلى أجهزة متعددة

تسمح لك واجهات برمجة تطبيقات المشرف FCM بالبث المتعدد لرسالة. إلى قائمة الرموز المميّزة لتسجيل الأجهزة يمكنك تحديد ما يصل إلى 500 جهاز. الرموز المميزة للتسجيل لكل استدعاء.

Node.js

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

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

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

جافا

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

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

Python

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

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

انتقال

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

والقيمة الناتجة هي قائمة بالرموز المميزة تتجاوب مع ترتيب رموز الإدخال المميزة. ويكون هذا مفيدًا عندما تريد التحقق من الرموز المميزة الناتجة في الأخطاء.

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

جافا

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

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

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

Python

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

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

انتقال

// Create a list containing up to 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}");
}

إرسال رسائل إلى المواضيع

بعد إنشاء موضوع، إما من خلال اشتراك مثيلات تطبيق العميل في الموضوع من جانب العميل أو عبر server API، يمكنك إرسال رسائل إلى الموضوع. إذا كانت هذه هي المرة الأولى التي ترسل فيها طلبات لإنشاء FCM، اطّلِع على دليل بيئة الخادم وFCM على الخلفية ومعلومات الإعداد المهمة.

في منطق الإرسال في الخلفية، حدِّد اسم الموضوع المطلوب كما هو موضح:

Node.js

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

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

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

جافا

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

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

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

Python

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

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

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

انتقال

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

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

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

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

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

لإرسال رسالة إلى مجموعة من المواضيع، تحديد condition، وهو تعبير منطقي يحدد الموضوعات المستهدفة. على سبيل المثال، سيؤدي الشرط التالي إلى إرسال رسائل إلى الأجهزة المشتركة في TopicA وإما TopicB أو TopicC:

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

تقيّم FCM أولاً أي شروط بين قوسين، ثم تقيّم التعبير من اليسار إلى اليمين. في التعبير أعلاه، اشترك مستخدم في لا يتلقى أي موضوع فردي الرسالة. وبالمثل، فإن المستخدم الذي لا الاشتراك في TopicA لا يتلقى الرسالة. تفعل هذه المجموعات استلامه:

  • TopicA وTopicB
  • TopicA وTopicC

يمكنك تضمين ما يصل إلى خمسة مواضيع في التعبير الشرطي.

للإرسال إلى أحد الشروط:

Node.js

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

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

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

جافا

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

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

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

Python

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

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

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

انتقال

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

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

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

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

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

إرسال رسائل إلى مجموعات الأجهزة

لإرسال رسائل إلى مجموعات أجهزة، استخدِم HTTP v1 API. إذا كنت حاليًا الإرسال إلى مجموعات الأجهزة باستخدام واجهات برمجة تطبيقات الإرسال القديمة المتوقّفة نهائيًا أو HTTP أو XMPP أو أي من الإصدارات الأقدم Firebase Admin SDK لنظام Node.js استنادًا إلى البروتوكولات القديمة، ننصحك بشدة نقل البيانات إلى HTTP v1 API في أقرب وقت ممكن. واجهات برمجة تطبيقات الإرسال القديمة في يونيو 2024.

إنّ إرسال الرسائل إلى مجموعة أجهزة يشبه إلى حد كبير إرسال الرسائل الرسائل إلى جهاز فردي، باستخدام الطريقة نفسها تفويض طلبات الإرسال. ضبط token إلى مفتاح إشعار المجموعة:

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

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

إرسال مجموعة من الرسائل

تتيح حزم تطوير البرامج (SDK) للمشرف إرسال الرسائل على دفعات. يمكنك تجميع ما يصل إلى 500 مشترك. الرسائل في دفعة واحدة وإرسالها جميعًا في طلب واجهة برمجة تطبيقات واحد، تحسّنًا ملحوظًا في الأداء عبر إرسال طلبات HTTP منفصلة لكل رسالة.

يمكن استخدام هذه الميزة لإنشاء مجموعة مخصّصة من الرسائل وإرسالها إلى مستلِمين مختلفين، بما في ذلك المواضيع أو رموز محددة لتسجيل الجهاز يمكنك استخدام هذه الميزة، مثلاً، في حال أردت إرسال رسائل إلى شرائح جمهور مختلفة في الوقت نفسه التفاصيل في نص الرسالة.

Node.js

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

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

جافا

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

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

Python

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

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

انتقال

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

إرسال رسائل مباشرة يتم تفعيل التمهيد (Android فقط)

يمكنك إرسال الرسائل إلى الأجهزة في وضع التشغيل المباشر باستخدام HTTP v1 أو واجهات برمجة تطبيقات HTTP قديمة. قبل الإرسال إلى الأجهزة في وضع التشغيل المباشر، فتأكد من إكمال الخطوات تفعيل أجهزة العملاء من تلقّي رسائل "المراسلة عبر السحابة الإلكترونية من Firebase" في وضع التشغيل المباشر.

الإرسال باستخدام واجهة برمجة تطبيقات HTTP للإصدار 1 من FCM

يجب أن يشتمل طلب الرسالة على المفتاح "direct_boot_ok" : true في AndroidConfig خيار لنص الطلب. على سبيل المثال:

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

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

الإرسال باستخدام واجهة برمجة تطبيقات HTTP القديمة لخدمة "المراسلة عبر السحابة الإلكترونية من Firebase"

يجب أن يشتمل طلب الرسالة على المفتاح "direct_boot_ok" : true في أعلى الصفحة. مستوى نص الطلب. على سبيل المثال:

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

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

يمكن للتطبيقات معالجة الرسائل المُرسَلة باستخدام هذا المفتاح في نص الطلب على الأجهزة التي تكون في وضع التشغيل المباشر حاليًا (وأيضًا عندما لا تكون في هذا الوضع).

تخصيص الرسائل على جميع الأنظمة الأساسية

يتيح كل من Firebase Admin SDK وبروتوكول HTTP للإصدار 1 من خدمة FCM إمكانية تلقّي رسالتك تطلب تعيين جميع الحقول المتاحة في message الخاص بك. يشمل هذا النوع من المحتوى ما يلي:

  • مجموعة مشتركة من الحقول ليتم تفسيرها بواسطة جميع مثيلات التطبيقات التي تلقي الرسالة.
  • مجموعات حقول خاصة بالنظام الأساسي، مثل AndroidConfig وWebpushConfig لا يتم تفسيرها إلا من خلال مثيلات التطبيق التي تعمل على النظام الأساسي المحدد.

تمنحك عمليات الحظر الخاصة بالنظام الأساسي المرونة في تخصيص الرسائل المنصات المختلفة لضمان التعامل معها بشكل صحيح عند استلامها. تشير رسالة الأشكال البيانية ستأخذ خلفية FCM جميع المعلمات المحددة في الاعتبار وتخصِّص ورسالة لكل منصة.

متى تستخدم الحقول المشتركة

استخدِم الحقول الشائعة عند:

  • استهداف مثيلات التطبيقات على جميع الأنظمة الأساسية: Apple وAndroid والويب
  • إرسال رسائل إلى المواضيع

يمكن لجميع مثيلات التطبيقات، بغض النظر عن النظام الأساسي، تفسير العوامل الشائعة التالية الحقول:

حالات استخدام الحقول الخاصة بالنظام الأساسي

استخدِم الحقول الخاصة بالنظام الأساسي عندما تريد:

  • إرسال الحقول إلى أنظمة أساسية معيّنة فقط
  • إرسال الحقول الخاصة بالنظام الأساسي بالإضافة إلى الحقول المشتركة

عندما تريد إرسال قيم إلى أنظمة أساسية معيّنة فقط، لا تستخدم الحقول المشتركة؛ يستخدمون حقولاً خاصة بالنظام الأساسي. على سبيل المثال، لإرسال إشعار على أنظمة Apple الأساسية والويب فقط وليس Android، يجب استخدام مجموعتين منفصلتين من أحدهما لـ Apple والآخر للويب.

عندما ترسل رسائل تحتوي على خيارات التسليم، استخدم الحقول الخاصة بالنظام الأساسي لإعدادها. يمكنك تحديد قيم مختلفة لكل منصّة إذا التي تريدها. ومع ذلك، حتى عندما تريد تعيين نفس القيمة بشكل أساسي عبر يجب استخدام حقول متعلقة بالأنظمة الأساسية. هذا لأن كل منصة القيمة بشكل مختلف قليلاً - على سبيل المثال، تُعد مدة البقاء على نظام Android كوقت انتهاء الصلاحية بالثواني، بينما يتم تحديده على Apple انتهاء الصلاحية date.

مثال: رسالة إشعار تتضمن خيارات اللون والرمز

يُرسل نموذج الطلب هذا عنوان إشعار مشترَك ومحتواه إلى جميع المستخدمين. ولكنه يرسل أيضًا بعض عمليات الإلغاء الخاصة بالنظام الأساسي إلى Android الأجهزة.

بالنسبة إلى أجهزة Android، يضبط الطلب رمزًا خاصًا ولونًا لعرضهما على أجهزة Android. كما هو موضّح في مرجع AndroidNotification، يتم تحديد اللون بتنسيق #rrggbb، ويجب أن تكون الصورة قابلة للرسم مرجع رمز محلي لتطبيق Android.

في ما يلي تقريب للتأثير المرئي على جهاز المستخدم:

رسم بسيط لجهازَين يعرض أحدهما رمزًا ولونًا مخصّصَين

Node.js

const topicName = 'industry-tech';

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

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

جافا

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

Python

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

انتقال

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

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

يمكنك الاطّلاع على المستندات المرجعية للإصدار 1 من HTTP للحصول على تفاصيل كاملة عن المفاتيح المتاحة في الوحدات الخاصة بالنظام الأساسي في نص الرسالة.

مثال: رسالة إشعار بها صورة مخصّصة

يرسل المثال التالي طلب الإرسال عنوان إشعار شائع إلى جميع الأنظمة الأساسية، ولكنه يرسل أيضًا صورة. فيما يلي تقريب للتأثير المرئي على جهاز المستخدم:

رسم بسيط لصورة في إشعار شاشة

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

يمكنك الاطّلاع على المستندات المرجعية للإصدار 1 من HTTP للحصول على تفاصيل كاملة عن المفاتيح المتاحة في الوحدات الخاصة بالنظام الأساسي في نص الرسالة.

مثال: رسالة إشعار مع إجراء نقر مرتبط

يرسل المثال التالي لطلب الإرسال عنوان إشعار شائع إلى جميع ولكن يرسل أيضًا إجراءً لينفذه التطبيق استجابةً تفاعل المستخدم مع الإشعار. في ما يلي تقريب للتأثير المرئي على جهاز المستخدم:

رسم بسيط لمستخدم ينقر على صفحة ويب لفتح صفحة ويب

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

يمكنك الاطّلاع على المستندات المرجعية للإصدار 1 من HTTP للحصول على تفاصيل كاملة عن المفاتيح المتاحة في الوحدات الخاصة بالنظام الأساسي في نص الرسالة.

مثال: رسالة إشعار بخيارات الترجمة

يرسل المثال التالي طلب الإرسال خيارات الترجمة للعميل لعرض الرسائل المترجمة. في ما يلي تقريب للتأثير المرئي على جهاز المستخدم:

رسم بسيط لجهازين يعرضان نصًا باللغتين الإنجليزية والإسبانية

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

يمكنك الاطّلاع على المستندات المرجعية للإصدار 1 من HTTP للحصول على تفاصيل كاملة عن المفاتيح المتاحة في الوحدات الخاصة بالنظام الأساسي في نص الرسالة.

رموز خطأ REST الخاصة بواجهة برمجة التطبيقات HTTP v1

تحتوي استجابات خطأ HTTP لواجهة برمجة التطبيقات HTTP v1 على رمز خطأ ورسالة خطأ وحالة خطأ. وقد تحتوي أيضًا على مصفوفة details مع مزيد من التفاصيل حول الخطأ.

في ما يلي نموذجان للرد على الخطأ:

المثال 1: استجابة خطأ من طلب HTTP v1 API تحتوي على قيمة غير صالحة في رسالة بيانات

{
  "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: استجابة خطأ من طلب HTTP v1 API باستخدام رمز مميَّز غير صالح للتسجيل

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

يُرجى العِلم أنّ كلتا الرسالتَين لهما الرمز نفسه والحالة نفسيهما، ولكن مصفوفة التفاصيل تحتوي على قيم في أنواع مختلفة. يحتوي المثال الأول على النوع type.googleapis.com/google.rpc.BadRequest الذي يشير إلى وجود خطأ في قيم الطلب. المثال الثاني من النوع type.googleapis.com/google.firebase.fcm.v1.FcmError به خطأ خاص بالمراسلة عبر السحابة الإلكترونية من Firebase. بالنسبة إلى العديد من الأخطاء، تحتوي مصفوفة التفاصيل على المعلومات التي ستحتاجها لتصحيح الأخطاء والعثور على حلّ.

يسرد الجدول التالي رموز الخطأ في واجهة برمجة التطبيقات FCM v1 REST أوصافها.

رمز الخطأ خطوات الوصف والحلّ
UNSPECIFIED_ERROR لا تتوفر معلومات أخرى عن هذا الخطأ. بلا.
INVALID_ARGUMENT (رمز خطأ HTTP = 400) كانت مَعلمات الطلب غير صالحة. يتم إرجاع إضافة من النوع google.rpc.BadRequest لتحديد الحقل غير الصالح. تشمل الأسباب المحتملة التسجيل غير الصالح، أو اسم الحزمة غير صالح، أو حجم الرسالة أكبر من اللازم، أو مفتاح بيانات غير صالح، أو مدة البقاء (TTL) غير الصالحة، أو غير ذلك من المعلمات غير الصالحة.
تسجيل غير صالح: تحقَّق من تنسيق الرمز المميّز للتسجيل الذي تمرِّره إلى الخادم. تأكَّد من تطابق الرمز مع الرمز المميّز للتسجيل الذي يتلقّاه تطبيق العميل من التسجيل لدى خدمة "المراسلة عبر السحابة الإلكترونية من Firebase". لا تقتطع الرمز المميّز أو تدرج أحرفًا إضافية.
اسم الحزمة غير صالح: تأكَّد من توجيه الرسالة إلى رمز مميَّز للتسجيل يتطابق اسم حزمته مع القيمة التي تم تمريرها في الطلب.
حجم الرسالة كبير جدًا: تأكَّد من أنّ الحجم الإجمالي لبيانات الحمولة المضمَّنة في الرسالة لا يتجاوز حدود "المراسلة عبر السحابة الإلكترونية من Firebase": 4096 بايت لمعظم الرسائل، أو 2048 بايت في حالة الرسائل المُرسَلة إلى مواضيع. وهذا يشمل كلاً من المفاتيح والقيم.
مفتاح بيانات غير صالح: تأكَّد من أنّ بيانات الحمولة لا تحتوي على مفتاح (مثل from أو gcm أو أي قيمة مسبوقة بـ google) يستخدمها داخليًا في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase". يُرجى العلم أنّ بعض الكلمات (مثل تصغير_key) تستخدمها أيضًا خدمة "المراسلة عبر السحابة الإلكترونية من Firebase"، ولكن يُسمح باستخدامها في الحمولة، وفي هذه الحالة سيتم تجاهل قيمة الحمولة من خلال قيمة "المراسلة عبر السحابة الإلكترونية من Firebase".
مدة البقاء غير صالحة: تأكَّد من أنّ القيمة المستخدَمة في ttl هي عدد صحيح يمثّل مدّة تتراوح بالثواني بين 0 و2419200 (4 أسابيع).
المَعلمات غير الصالحة: تأكَّد من أنّ المَعلمات المقدّمة لها الاسم والنوع الصحيحَين.
UNREGISTERED (رمز خطأ HTTP = 404) تم إلغاء تسجيل مثيل التطبيق من خدمة "المراسلة عبر السحابة الإلكترونية من Firebase". يعني ذلك عادةً أنّ الرمز المميّز المستخدَم لم يعُد صالحًا ويجب استخدام رمز جديد. قد يعود السبب في هذا الخطأ إلى عدم توفّر رموز التسجيل أو الرموز المميّزة غير المسجَّلة.
تسجيل غير متوفر: إذا كان هدف الرسالة هو قيمة token، تأكَّد من أنّ الطلب يحتوي على رمز مميَّز للتسجيل.
غير مسجَّل: قد لا يعود الرمز المميّز الحالي للتسجيل صالحًا في عدد من السيناريوهات، بما في ذلك:
- إذا ألغى تطبيق العميل التسجيل في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase":
- إذا تم إلغاء تسجيل تطبيق العميل تلقائيًا، وقد يحدث ذلك إذا ألغى المستخدم تثبيت التطبيق. على سبيل المثال، في نظام التشغيل iOS، إذا أبلغت خدمة ملاحظات APNs بأنّ الرمز المميّز لأسماء نقاط الوصول غير صالح.
- في حال انتهاء صلاحية الرمز المميّز للتسجيل (على سبيل المثال، قد تقرِّر Google إعادة تحميل الرموز المميّزة للتسجيل أو قد انتهت صلاحية رموز APNs لأجهزة iOS).
- إذا تم تحديث تطبيق العميل ولكن لم يتم إعداد الإصدار الجديد لاستلام الرسائل.
في جميع هذه الحالات، عليك إزالة رمز التسجيل المميّز هذا من خادم التطبيق وإيقاف استخدامه لإرسال الرسائل.
SENDER_ID_MISMATCH (رمز خطأ HTTP = 403) يختلف معرّف المُرسِل الذي تمت مصادقته عن معرّف المُرسِل للرمز المميز للتسجيل. ويرتبط الرمز المميّز للتسجيل بمجموعة معيّنة من المُرسِلين. عندما يسجِّل تطبيق عميل في خدمة "المراسلة عبر السحابة الإلكترونية من Firebase"، يجب تحديد المرسِلين المسموح لهم بإرسال الرسائل. يجب استخدام أحد معرّفات المرسِلين هذه عند إرسال الرسائل إلى تطبيق العميل. في حال التبديل إلى مُرسِل مختلف، لن تعمل الرموز المميّزة الحالية للتسجيل.
QUOTA_EXCEEDED (رمز خطأ HTTP = 429) تم تجاوز حد الإرسال لهدف الرسالة. يتم عرض إضافة من النوع google.rpc.QuotaFailure لتحديد الحصة التي تم تجاوزها. قد يرجع السبب في هذا الخطأ إلى تجاوز حصة معدل الرسائل أو تجاوز الحصة لمعدل الرسائل على الجهاز أو تجاوز حصة معدّل الرسائل المتعلقة بالمواضيع.
تم تجاوز معدل الرسائل: معدل إرسال الرسائل مرتفع جدًا. يجب عليك تخفيض المعدل الكلي لإرسال الرسائل. ويمكنك استخدام خوارزمية الرقود الأسي مع مهلة أولية تبلغ دقيقة واحدة على الأقل لإعادة محاولة الرسائل المرفوضة.
تم تجاوز معدّل الرسائل على الجهاز: معدّل الرسائل إلى جهاز معيَّن مرتفع جدًا. راجِع الحد الأقصى لمعدّل الرسائل في جهاز واحد. يمكنك تقليل عدد الرسائل المُرسَلة إلى هذا الجهاز واستخدام ميزة "الرقود الأسي" لإعادة محاولة الإرسال.
تم تجاوز معدل الرسائل المتعلقة بالموضوع: معدل الرسائل الموجَّهة إلى المشتركين حول موضوع معين مرتفع جدًا. يمكنك تقليل عدد الرسائل المُرسَلة حول هذا الموضوع واستخدام ميزة "الرقود الأسي" مع مهلة أولية تبلغ دقيقة واحدة على الأقل لإعادة محاولة الإرسال.
UNAVAILABLE (رمز خطأ HTTP = 503) تم تحميل الخادم بشكل زائد. لم يتمكّن الخادم من معالجة الطلب في الوقت المناسب. يُرجى إعادة محاولة الطلب نفسه، ولكن يجب:
- عليك تنفيذ العنوان "إعادة المحاولة بعد" إذا تم تضمينه في الاستجابة من خادم اتصال "المراسلة عبر السحابة الإلكترونية من Firebase".
- تنفيذ "الرقود الأسي" في آلية إعادة المحاولة. (على سبيل المثال، إذا انتظرت ثانية واحدة قبل إعادة المحاولة الأولى، انتظر لمدة ثانيتين على الأقل قبل المحاولة التالية، ثم 4 ثوانٍ وما إلى ذلك). إذا كنت ترسل رسائل متعددة، فكّر في تطبيق التشويش. لمزيد من المعلومات، يُرجى الاطّلاع على التعامل مع محاولات إعادة المحاولة. ويخاطر المُرسِلون الذين يتسبّبون بمشاكل أن يتم إدراجهم في قائمة الحظر.
INTERNAL (رمز خطأ HTTP = 500) حدث خطأ داخلي غير معروف. حدث خطأ في الخادم أثناء محاولة معالجة الطلب. يمكنك إعادة محاولة تقديم الطلب نفسه بعد تنفيذ الاقتراحات في قسم معالجة محاولات إعادة المحاولة. في حال استمرار ظهور الخطأ، يُرجى التواصل مع فريق دعم Firebase.
THIRD_PARTY_AUTH_ERROR (رمز خطأ HTTP = 401) شهادة أسماء نقاط الوصول (APN) أو مفتاح المصادقة على الويب غير صالح أو غير متوفّر. تعذر إرسال رسالة تستهدف جهاز iOS أو تسجيل فوري على الويب. تحقق من صلاحية بيانات اعتماد التطوير والإنتاج.

رموز خطأ المشرف

يسرد الجدول التالي رموز الخطأ في واجهة برمجة التطبيقات FCM لمشرف Firebase أوصافها، بما في ذلك خطوات الحل الموصى بها.

رمز الخطأ خطوات الوصف والحلّ
messaging/invalid-argument تم توفير وسيطة غير صالحة لطريقة FCM. الخطأ على معلومات إضافية.
messaging/invalid-recipient مستلم الرسالة المقصود غير صالح. ينبغي أن تظهر رسالة الخطأ تحتوي على معلومات إضافية.
messaging/invalid-payload تم تقديم عنصر غير صالح لحمولة الرسالة. ينبغي أن تظهر رسالة الخطأ تحتوي على معلومات إضافية.
messaging/invalid-data-payload-key تحتوي حمولة رسالة البيانات على مفتاح غير صالح. الاطّلاع على المرجع وثائق DataMessagePayload للمفاتيح المحظورة.
messaging/payload-size-limit-exceeded تتجاوز حمولة الرسائل المقدّمة حدود الحجم المسموح بها، وهي FCM. تشير رسالة الأشكال البيانية الحد الأقصى هو 4096 بايت لمعظم الرسائل. بالنسبة إلى الرسائل المُرسَلة إلى المواضيع، يبلغ الحد الأقصى 2048 بايت. تشير رسالة الأشكال البيانية يشمل إجمالي حجم الحمولة كلاً من المفاتيح والقيم.
messaging/invalid-options تم تقديم عنصر غير صالح لخيارات الرسالة. ينبغي أن تظهر رسالة الخطأ تحتوي على معلومات إضافية.
messaging/invalid-registration-token تم تقديم رمز تسجيل غير صالح. تأكَّد من أنّ المعلومات تطابق معلومات التسجيل. الرمز المميّز الذي يتلقّاه تطبيق العميل من التسجيل باستخدام FCM. لا تفعل واقتطاعه أو إضافة أحرف أخرى إليه.
messaging/registration-token-not-registered الرمز المميّز للتسجيل الذي تم تقديمه غير مسجَّل. مستند صالح سابقًا التسجيل المميّز لعدة أسباب، بما في ذلك:
  • ألغى تطبيق العميل تسجيل نفسه من FCM.
  • تم إلغاء تسجيل تطبيق العميل تلقائيًا. يمكن أن يحدث هذا إذا أن يلغي المستخدم تثبيت التطبيق أو على أنظمة Apple الأساسية، في حال كانت تعليقات أسماء نقاط الوصول (APN) أبلغت الخدمة عن أنّ الرمز المميّز لأسماء نقاط الوصول (APN) غير صالح.
  • انتهت صلاحية الرمز المميّز للتسجيل. على سبيل المثال، قد تقرر Google قد تكون صلاحية الرموز المميّزة للتسجيل أو إعادة تحميل أسماء نقاط الوصول قد انتهت في أجهزة Apple.
  • تم تحديث تطبيق العميل، ولكن لم يتم ضبط الإصدار الجديد على استلام رسائل
في جميع هذه الحالات، عليك إزالة الرمز المميّز للتسجيل والتوقّف عن استخدامه من أجل إرسال الرسائل
messaging/invalid-package-name تم توجيه الرسالة إلى رمز مميز للتسجيل يحمل اسم الحزمة لا تتطابق مع المعلومات المقدّمة الخيار "restrictedPackageName"
messaging/message-rate-exceeded معدل الرسائل الموجهة إلى هدف معين مرتفع جدًا. تقليل العدد من الرسائل المرسلة إلى هذا الجهاز أو الموضوع وعدم إعادة المحاولة على الفور الإرسال إلى هذا الهدف.
messaging/device-message-rate-exceeded معدّل الرسائل إلى جهاز معيّن مرتفع جدًا. تقليل العدد من الرسائل المرسلة إلى هذا الجهاز وعدم إعادة محاولة الإرسال على الفور إلى هذا الجهاز.
messaging/topics-message-rate-exceeded معدل الرسائل الموجهة إلى المشتركين في موضوع معين مرتفع جدًا. تقليل عدد الرسائل المرسلة لهذا الموضوع، وعدم إعادة محاولة الإرسال إلى هذا الموضوع.
messaging/too-many-topics تم الاشتراك في رمز مميّز للتسجيل على أقصى عدد من المواضيع. ولا يمكن الاشتراك فيها بعد الآن.
messaging/invalid-apns-credentials تعذر إرسال رسالة تستهدف جهاز Apple نظرًا لأن لم يتم تحميل شهادة طبقة المقابس الآمنة (SSL) المطلوبة لـ APNs أو انتهت صلاحيتها. اطّلِع على صلاحية شهادات التطوير والإنتاج الخاصة بك.
messaging/mismatched-credential ليس لبيانات الاعتماد المستخدَمة لمصادقة حزمة تطوير البرامج (SDK) هذه الإذن إرسال الرسائل إلى الجهاز المتوافق مع التسجيل المقدَّم الرمز المميز. تأكد من أن كل من بيانات الاعتماد ورمز التسجيل ينتميان إلى مشروع Firebase نفسه. عرض إضافة Firebase إلى تطبيقك للحصول على مستندات حول كيفية مصادقة Firebase Admin SDK.
messaging/authentication-error تعذّر على حزمة SDK مصادقة خوادم FCM. تأكد من مصادقة Firebase Admin SDK باستخدام بيانات اعتماد ذات الأذونات لإرسال FCM رسالة. عرض إضافة Firebase إلى تطبيقك للحصول على مستندات حول كيفية مصادقة Firebase Admin SDK.
messaging/server-unavailable لم يتمكّن خادم FCM من معالجة الطلب في الوقت المناسب. عليك إعادة محاولة إرسال الطلب نفسه، ولكن يجب:
  • عليك اتّباع عنوان Retry-After إذا تم تضمينه في استجابة من خادم الاتصال FCM.
  • تنفيذ الرقود الأسي في آلية إعادة المحاولة. على سبيل المثال: إذا انتظرت ثانية واحدة قبل إعادة المحاولة الأولى، انتظِر لمدة ثانيتين على الأقل ثانية قبل الثانية التالية، ثم أربع ثوانٍ، وهكذا. إذا كنت إرسال رسائل متعددة، فقم بتأخير كل واحدة منها بشكل مستقل عن طريق مبلغ عشوائي إضافي لتجنُّب إصدار طلب جديد لجميع الرسائل في نفس الوقت.
قد يُدرج المُرسِلون الذين يسببون مشاكل في قائمة سوداء.
messaging/internal-error حدث خطأ في خادم FCM أثناء محاولة معالجة طلبك. يمكنك إعادة محاولة تقديم الطلب نفسه باتّباع المتطلبات. مدرجة في صف messaging/server-unavailable أعلاه. إذا كانت لا يزال الخطأ مستمرًا، لذا يُرجى إبلاغنا قناة دعم تقرير الأخطاء.
messaging/unknown-error حدث خطأ غير معروف في الخادم. يمكنك الاطلاع على استجابة الخادم الأولية في لمزيد من التفاصيل. إذا ظهر لك هذا الخطأ، يُرجى الإبلاغ عنه. رسالة الخطأ الكاملة إلى قناة دعم تقرير الأخطاء.

إرسال الرسائل باستخدام بروتوكولات خادم التطبيقات القديمة

إذا كنت تستخدم حاليًا البروتوكولات القديمة، أنشِئ طلبات الرسائل على النحو الموضّح. في هذا القسم. ضع في اعتبارك أنه إذا كنت ترسل إلى منصات متعددة عبر HTTP، يمكن لبروتوكول الإصدار 1 تبسيط طلبات الرسائل بشكل كبير.

إرسال رسائل إلى أجهزة محدّدة

لإرسال رسائل إلى أجهزة محدّدة، عليك ضبط مفتاح to على عملية التسجيل. لمثيل التطبيق المحدد. الاطلاع على معلومات إعداد البرنامج الرئيسية لمعرفة المزيد عن رموز التسجيل.

طلب HTTP POST

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

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

استجابة HTTP

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

رسالة XMPP

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

ردّ XMPP

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

يوفر خادم اتصال XMPP بعض الخيارات الأخرى للردود. عرض تنسيق استجابة الخادم:

للحصول على القائمة الكاملة لخيارات الرسائل المتاحة عند إرسال الرسالة التي تحوّلت إلى مسار الرسائل إلى تطبيقات العميل، يمكنك الاطلاع على المعلومات المرجعية للتطبيقات التي اخترتها بروتوكول خادم الاتصال، HTTP أو XMPP

إرسال رسائل إلى المواضيع

إن إرسال الرسائل إلى موضوع Firebase Cloud Messaging يشبه إلى حد كبير إرسال الرسائل إلى جهاز فردي أو إلى مجموعة مستخدمين. التطبيق يضبط الخادم مفتاح to بقيمة مثل /topics/yourTopic. يمكن للمطوّرين اختر أي اسم موضوع يتطابق مع التعبير العادي: "/topics/[a-zA-Z0-9-_.~%]+"

لإرسال مجموعة من المواضيع المتعددة، يجب أن يضبط خادم التطبيق condition (بدلاً من المفتاح to) إلى شرط منطقي المواضيع المستهدفة. لإرسال الرسائل مثلاً إلى الأجهزة التي اشتركت إلى TopicA وإمّا TopicB أو TopicC:

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

تقيّم FCM أولاً أي شروط بين قوسين، ثم تقيّم التعبير من اليسار إلى اليمين. في التعبير أعلاه، المستخدم مشترك في أي موضوع فردي تلقي الرسالة. وبالمثل، عندما لا يشترك المستخدم في TopicA لا يتلقى الرسالة. تحصل هذه المجموعات عليها:

  • الموضوع (أ) والموضوع (ب)
  • الموضوع (أ) والموضوع (ج)

يمكنك تضمين ما يصل إلى خمسة موضوعات في التعبير الشرطي، ويتم دعم الأقواس. عوامل التشغيل المتوافقة: && و||

طلب HTTP POST للموضوع

الإرسال إلى موضوع واحد:

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

الإرسال إلى الأجهزة المشتركة في مواضيع "الكلاب" أو "قطط":

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

استجابة HTTP للموضوع

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

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

رسالة XMPP حول الموضوع

الإرسال إلى موضوع واحد:

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


  </gcm>
</message>

الإرسال إلى الأجهزة المشتركة في مواضيع "الكلاب" أو "قطط":

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


  </gcm>
</message>

رد XMPP على الموضوع

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

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

يمكنك توقُّع حدوث تأخير يصل إلى 30 ثانية قبل خادم FCM. يؤدي إلى عرض استجابة ناجحة أو فشل لطلبات إرسال المواضيع. يُرجى التأكد من أنّ: لضبط قيمة المهلة في خادم التطبيق في الطلب وفقًا لذلك.

إرسال رسائل إلى مجموعات الأجهزة

إرسال رسائل إلى مجموعة أجهزة باستخدام واجهات برمجة التطبيقات القديمة التي تم إيقافها نهائيًا يشبه إلى حد كبير إرسال الرسائل إلى جهاز فردي. ضبط مَعلمة to إلى مفتاح الإشعار الفريد لمجموعة الأجهزة. توضِّح الأمثلة الواردة في هذا القسم كيفية إرسال البيانات. الرسائل إلى مجموعات الأجهزة في بروتوكولات HTTP وXMPP القديمة.

طلب HTTP POST لمجموعة الأجهزة

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

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

استجابة HTTP لمجموعة الأجهزة

في ما يلي مثال على "النجاح"— notification_key يتضمن رمزين مميزين للتسجيل، وكانت الرسالة تم إرسالها بنجاح إلى كل منهما:

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

فيما يلي مثال على "النجاح الجزئي" — لدى "notification_key" 3 رموز مميّزة للتسجيل مرتبطة. معها. تم إرسال الرسالة بنجاح إلى أحد المستخدمين المسجّلين والرموز المميزة فقط. تسرد رسالة الرد الرموز المميزة للتسجيل (registration_ids) الذين تعذّر استلام الرسالة:

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

عند تعذُّر تسليم رسالة إلى جهاز أو أكثر من الرموز المميّزة للتسجيل المرتبطة بالرمز notification_key يجب على خادم التطبيق إعادة المحاولة مع التراجع بين محاولات إعادة المحاولة.

وإذا حاول الخادم إرسال رسالة إلى مجموعة أجهزة لا تتضمّن أي أعضاء، تظهر الاستجابة على النحو التالي، 0 نجاح 0:

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

رسالة XMPP لمجموعة الأجهزة

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

استجابة XMPP لمجموعة الأجهزة

عند إرسال الرسالة إلى أي من الأجهزة في المجموعة بنجاح، يستجيب خادم اتصال XMPP مع وجود ACK. في حال حذف تفشل جميع الرسائل المرسلة إلى جميع الأجهزة في المجموعة، اتصال XMPP استجابة الخادم بأحرف NACK.

فيما يلي مثال على "النجاح" — notification_key تشتمل على 3 رموز تسجيل مرتبطة بها، وكانت الرسالة تم إرسالها بنجاح إلى جميعهم:

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

فيما يلي مثال على "النجاح الجزئي" — لدى "notification_key" 3 رموز مميّزة للتسجيل مرتبطة. معها. تم إرسال الرسالة بنجاح إلى أحد المستخدمين المسجّلين والرموز المميزة فقط. تسرد رسالة الرد الرموز المميزة للتسجيل التي تعذّر تلقّي الرسالة:

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

عند تعذُّر تسليم خادم الاتصال FCM إلى جميع الأجهزة في المجموعة. سيتلقّى خادم التطبيق استجابة سريعة.

للاطّلاع على القائمة الكاملة لخيارات الرسائل، يمكنك الاطّلاع على المعلومات المرجعية. لبروتوكول خادم الاتصال الذي اخترته، HTTP أو XMPP

Firebase Admin SDK طريقة إرسال قديمة

إنّ حزمة تطوير البرامج (SDK) في Node.js لمشرف Firebase تتيح طرق الإرسال (FCM) رسائل استنادًا إلى واجهة برمجة تطبيقات خادم "المراسلة عبر السحابة الإلكترونية من Firebase" القديمة: تقبل هذه الطرق وسيطات مختلفة مقارنةً بطريقة send(). يجب استخدام طريقة send() كلما أمكن ذلك، واستخدام الطرق الموضحة في هذه الصفحة عند إرسال رسائل إلى أجهزة فردية أو مجموعات الأجهزة.

الإرسال إلى أجهزة فردية

يمكنك تمرير رمز التسجيل إلى sendToDevice() طريقة إرسال رسالة إلى ذلك الجهاز:

Node.js

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

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

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

يمكن أن ترسل الطريقة sendToDevice() أيضًا رسالة بث متعدد (أي، رسالة إلى أجهزة متعددة) من خلال تمرير مجموعة من رموز التسجيل المميزة بدلاً من ذلك لرمز تسجيل مميز واحد فقط:

Node.js

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

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

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

تعرض الطريقة sendToDevice() وعدًا تم حله من خلال MessagingDevicesResponse يحتوي على الرد من FCM. يتطابق نوع الإرجاع عند تمرير رمز مميز واحد للتسجيل أو مصفوفة تسجيل الرموز المميزة.

تتسبب بعض الحالات مثل خطأ المصادقة أو تقييد المعدل في فشل معالجة الرسالة. في هذه الحالات، فإن الوعد الذي تم إرجاعه تم رفض "sendToDevice()" مع ظهور خطأ. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، أخطاء واجهة برمجة التطبيقات FCM للمشرف.

الإرسال إلى مجموعة أجهزة

تشير رسالة الأشكال البيانية sendToDeviceGroup() إرسال رسالة إلى مجموعة أجهزة من خلال تحديد مفتاح الإشعار لمجموعة الأجهزة هذه:

Node.js

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

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

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

تعرض الطريقة sendToDeviceGroup() وعدًا تم حله من خلال MessagingDevicesResponse يحتوي على الرد من FCM.

تتسبب بعض الحالات مثل خطأ المصادقة أو تقييد المعدل في فشل معالجة الرسالة. في هذه الحالات، فإن الوعد الذي تم إرجاعه تم رفض "sendToDeviceGroup()" مع ظهور خطأ. للحصول على قائمة كاملة برموز الأخطاء، بما في ذلك الأوصاف وخطوات الحل، أخطاء واجهة برمجة التطبيقات FCM للمشرف.

تحديد حمولة الرسالة

الطرق المذكورة أعلاه استنادًا إلى FCM بروتوكولات قديمة قبول حمولة الرسائل كوسيطة ثانية ودعم كلاهما رسائل الإشعارات والبيانات: يمكنك تحديد نوع واحد أو كلا نوعَي الرسائل من خلال إنشاء كائن باستخدام data. و / أو notification. على سبيل المثال، إليك كيفية تحديد أنواع من حمولات الرسائل:

رسالة إشعار

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

رسالة البيانات

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

رسالة مجمّعة

const payload = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  data: {
    stock: 'GOOG',
    open: '829.62',
    close: '635.67'
  }
};

تشتمل حمولات رسائل الإشعارات على مجموعة فرعية محددة مسبقًا من الخصائص تختلف قليلاً حسب نظام تشغيل الجوال الذي تستهدفه. اطّلِع على المستندات المرجعية لطلب البحث NotificationMessagePayload للحصول على قائمة كاملة.

تتكون حمولات رسائل البيانات من أزواج مخصصة من المفاتيح والقيم مع بعض القيود، بما في ذلك حقيقة أن جميع القيم يجب أن تكون سلاسل. يمكنك الاطّلاع على مستندات مرجعية لـ DataMessagePayload للاطّلاع على قائمة كاملة بالقيود

تحديد خيارات الرسالة

الطرق المذكورة أعلاه استنادًا إلى FCM بروتوكولات قديمة قبول وسيطة ثالثة اختيارية تحدد بعض الخيارات الرسالة. مثلاً، يرسل المثال التالي رسالة ذات أولوية عالية. إلى جهاز تنتهي صلاحيته بعد 24 ساعة:

Node.js

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

// See the "Defining the message payload" section above for details
// on how to define a message payload.
const payload = {
  notification: {
    title: 'Urgent action needed!',
    body: 'Urgent action is needed to prevent your account from being disabled!'
  }
};

// Set the message as high priority and have it expire after 24 hours.
const options = {
  priority: 'high',
  timeToLive: 60 * 60 * 24
};

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

اطّلِع على المستندات المرجعية لطلب البحث MessagingOptions للاطّلاع على قائمة كاملة بالخيارات المتاحة