Catch up on everthing we announced at this year's Firebase Summit. Learn more

درخواست ارسال سرور برنامه را بسازید

با استفاده از Firebase Admin SDK یا پروتکل‌های سرور برنامه FCM، می‌توانید درخواست‌های پیام بسازید و آنها را به این نوع اهداف ارسال کنید:

  • نام موضوع
  • وضعیت
  • رمز ثبت دستگاه
  • نام گروه دستگاه (پروتکل‌های قدیمی و Firebase Admin SDK فقط برای Node.js)

می‌توانید پیام‌هایی را با یک محموله اعلان متشکل از فیلدهای از پیش تعریف‌شده، یک محموله داده از فیلدهای تعریف‌شده توسط کاربر یا پیامی حاوی هر دو نوع بار ارسال کنید. مشاهده انواع پیام برای اطلاعات بیشتر.

نمونه هایی در این صفحه نشان می دهد که چگونه برای ارسال پیام های اطلاع رسانی با استفاده از فایربیس محیط مدیریت SDK (که دارای پشتیبانی برای گره ، جاوا ، پایتون ، C # ، و برو ) و V1 پروتکل 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);

پایتون

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

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

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

برو

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

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

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

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

سی شارپ

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

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

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

باقی مانده

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

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

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

دستور cURL:

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

در صورت موفقیت، هر روش ارسال یک شناسه پیام را برمی گرداند. فایربیس محیط مدیریت SDK گرداند رشته ID در قالب projects/{project_id}/messages/{message_id} . پاسخ پروتکل HTTP یک کلید JSON است:

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

ارسال پیام به چندین دستگاه

REST API و Admin FCM APIs به شما امکان می دهند پیامی را به لیستی از نشانه های ثبت دستگاه چندپخش کنید. شما می توانید تا 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");

پایتون

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

سی شارپ

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

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

باقی مانده

یک درخواست دسته ای HTTP ایجاد کنید:

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

...

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

درخواست را در یک فایل ذخیره کنید (در این مثال batch_request.txt). سپس از دستور cURL استفاده کنید:

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

برای فایربیس SDK ها محیط مدیریت، این عملیات با استفاده از sendAll() API در زیر کاپوت، همانطور که در مثال نشان داده شده. مقدار بازگشتی است BatchResponse که پاسخ لیست مربوط به سفارش از نشانه های ورودی. این زمانی مفید است که می‌خواهید بررسی کنید کدام نشانه‌ها منجر به خطا شده‌اند.

Node.js

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

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

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

جاوا

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

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

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

پایتون

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

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

برو

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

سی شارپ

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

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

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

باقی مانده

هر ارسال فرعی یک پاسخ را برمی گرداند. پاسخ ها با یک واکنش رشته مرز با شروع از هم جدا --batch_ .

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q
Content-Type: application/http
Content-ID: response-

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "name": "projects/35006771263/messages/0:1570471792141125%43c11b7043c11b70"
}

...

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q
Content-Type: application/http
Content-ID: response-

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer

{
  "name": "projects/35006771263/messages/0:1570471792141696%43c11b7043c11b70"
}

--batch_nDhMX4IzFTDLsCJ3kHH7v_44ua-aJT6q--

ارسال پیام به موضوعات

بعد از اینکه شما یک موضوع، هم با اشتراک موارد برنامه سرویس گیرنده به موضوع در سمت سرویس گیرنده و یا از طریق ایجاد کرده اند API سرور ، شما می توانید پیام به موضوع ارسال. اگر این اولین بار خود را ساخت درخواست ارسال برای FCM است، راهنمای به دیدن محیط سرور خود را و FCM برای پس زمینه های مهم و اطلاعات راه اندازی.

در منطق ارسال خود در باطن، نام موضوع مورد نظر را مطابق شکل مشخص کنید:

Node.js

// The topic name can be optionally prefixed with "/topics/".
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);

پایتون

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

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

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

برو

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

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

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

سی شارپ

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

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

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

باقی مانده

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

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

دستور cURL:

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

برای ارسال یک پیام به ترکیبی از موضوعات، یک بیماری است، که یک عبارت منطقی است که موضوعات هدف مشخص را مشخص کنید. به عنوان مثال، شرایط زیر خواهد پیام ها به دستگاه هستند که در آنها ثبت ارسال TopicA و یا TopicB یا TopicC :

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

FCM ابتدا هر شرایط داخل پرانتز را ارزیابی می کند و سپس عبارت را از چپ به راست ارزیابی می کند. در عبارت بالا، کاربری که در یک موضوع مشترک است، پیامی را دریافت نمی کند. به همین ترتیب، کاربری که به مشترک نمی شوم TopicA کند پیام را دریافت نمی. این ترکیبات آن را دریافت می کنند:

  • TopicA و TopicB
  • TopicA و TopicC

می توانید حداکثر پنج موضوع را در عبارت شرطی خود بگنجانید.

برای ارسال به یک شرط:

Node.js

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

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

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

جاوا

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

پایتون

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

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

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

برو

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

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

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

سی شارپ

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

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

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

باقی مانده

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

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

دستور cURL:

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

یک دسته پیام بفرستید

REST API و Admin SDK از ارسال پیام‌ها به صورت دسته‌ای پشتیبانی می‌کنند. شما می توانید حداکثر 500 پیام را در یک دسته گروه بندی کنید و همه آنها را در یک تماس API ارسال کنید، با بهبود عملکرد قابل توجهی نسبت به ارسال درخواست های HTTP جداگانه برای هر پیام.

از این ویژگی می توان برای ایجاد مجموعه ای سفارشی از پیام ها و ارسال آنها به گیرندگان مختلف، از جمله موضوعات یا نشانه های ثبت دستگاه خاص استفاده کرد. از این ویژگی زمانی استفاده کنید که، برای مثال، نیاز دارید به طور همزمان پیام هایی را با جزئیات کمی متفاوت در متن پیام به مخاطبان مختلف ارسال کنید.

Node.js

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

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

جاوا

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

پایتون

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

سی شارپ

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

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

باقی مانده

با ترکیب لیستی از درخواست های فرعی، یک درخواست دسته ای HTTP بسازید:

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

...

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

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

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

شما می توانید پرس و جو بازگشت BatchResponse برای بررسی چگونگی بسیاری از پیام را به FCM موفقیت تحویل داده شدند. همچنین فهرستی از پاسخ‌ها را نشان می‌دهد که می‌توان از آنها برای بررسی وضعیت هر پیام استفاده کرد. ترتیب پاسخ ها با ترتیب پیام ها در لیست ورودی مطابقت دارد.

ارسال پیام‌های مستقیم با قابلیت بوت (فقط اندروید)

می‌توانید با استفاده از HTTP v1 یا APIهای قدیمی HTTP، پیام‌ها را در حالت بوت مستقیم به دستگاه‌ها ارسال کنید. قبل از ارسال به دستگاه در حالت بوت مستقیم، مطمئن شوید که شما به مراحل فعال کردن دستگاه های مشتری به پایان رسانده اند دریافت پیام FCM در حالت بوت مستقیم .

ارسال با استفاده از FCM v1 HTTP API

درخواست پیام باید کلید شامل "direct_boot_ok" : true در AndroidConfig گزینه های از بدن درخواست. مثلا:

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

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

با استفاده از API HTTP قدیمی FCM ارسال کنید

درخواست پیام باید کلید شامل "direct_boot_ok" : true در سطح بالا از بدن درخواست. مثلا:

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

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

پیام‌هایی که با این کلید در بدنه درخواست ارسال می‌شوند می‌توانند توسط برنامه‌های دستگاه‌هایی که در حال حاضر در حالت بوت مستقیم هستند (و همچنین زمانی که در آن حالت نیستند) مدیریت کنند.

سفارشی کردن پیام ها در پلتفرم ها

فایربیس محیط مدیریت SDK و پروتکل FCM V1 HTTP هر دو اجازه می دهد درخواست پیام خود را به مجموعه تمام زمینه های موجود در message شی. این شامل:

  • یک مجموعه مشترک از زمینه های به توسط همه موارد برنامه است که پیام را دریافت تفسیر شود.
  • مجموعه پلت فرم خاص از رشته ها مانند AndroidConfig و WebpushConfig ، تنها با نمونه برنامه های در حال اجرا بر روی پلت فرم های مشخص تفسیر شده است.

بلوک‌های مخصوص پلتفرم به شما انعطاف‌پذیری می‌دهند تا پیام‌ها را برای پلتفرم‌های مختلف سفارشی کنید تا اطمینان حاصل کنید که هنگام دریافت به‌درستی با آنها برخورد می‌شود. پشتیبان FCM تمام پارامترهای مشخص شده را در نظر می گیرد و پیام را برای هر پلتفرم سفارشی می کند.

زمان استفاده از فیلدهای مشترک

وقتی هستید از فیلدهای مشترک استفاده کنید:

  • هدف قرار دادن نمونه برنامه در تمام سیستم عامل - اپل، اندروید، و وب
  • ارسال پیام به موضوعات

همه نمونه های برنامه، صرف نظر از پلتفرم، می توانند فیلدهای مشترک زیر را تفسیر کنند:

زمان استفاده از فیلدهای خاص پلتفرم

زمانی که می خواهید از فیلدهای مخصوص پلتفرم استفاده کنید:

  • فیلدها را فقط به پلتفرم های خاص ارسال کنید
  • ارسال زمینه پلت فرم خاص علاوه بر زمینه های مشترک

هر زمان که شما می خواهید برای ارسال مقادیر تنها به سیستم عامل های خاص، انجام زمینه مشترک استفاده نکنید؛ از فیلدهای مخصوص پلتفرم استفاده کنید. به عنوان مثال، برای ارسال نوتیفیکیشن فقط به پلتفرم‌های اپل و وب اما نه برای اندروید، باید از دو مجموعه فیلد جداگانه، یکی برای اپل و دیگری برای وب استفاده کنید.

هنگامی که شما در حال ارسال پیام با خاص گزینه های تحویل ، استفاده از زمینه پلت فرم خاص به آنها را. در صورت تمایل می توانید مقادیر مختلفی را برای هر پلتفرم مشخص کنید. با این حال، حتی زمانی که می‌خواهید اساساً مقدار یکسانی را در بین پلتفرم‌ها تنظیم کنید، باید از فیلدهای مخصوص پلتفرم استفاده کنید. دلیل این است که هر پلت فرم ممکن است ارزش کمی متفاوت به عنوان مثال، زمان به زندگی می کنند بر روی آندروید به عنوان یک زمان انقضا در ثانیه تنظیم شده تفسیر، در حالی که در اپل آن را به عنوان یک تاریخ انقضا تنظیم شده است.

مثال: پیام اعلان با گزینه های رنگ و نماد

این درخواست ارسال مثال، عنوان و محتوای اعلان مشترک را به همه پلتفرم‌ها ارسال می‌کند، اما برخی موارد لغو خاص پلتفرم را نیز به دستگاه‌های Android ارسال می‌کند.

برای اندروید، درخواست یک نماد و رنگ خاص را برای نمایش در دستگاه های اندرویدی تنظیم می کند. همانطور که در مرجع برای اشاره AndroidNotification ، رنگ در فرمت #rrggbb مشخص است، و تصویر باید یک منبع آیکون ترسیم محلی به برنامه های آندروید است.

در اینجا تقریبی از جلوه بصری روی دستگاه کاربر آورده شده است:

طراحی ساده از دو دستگاه، با نمایش نماد و رنگ سفارشی

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

پایتون

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

برو

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

سی شارپ

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

باقی مانده

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

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
     "topic":"industry-tech",
     "notification":{
       "title":"`$FooCorp` up 1.43% on the day",
       "body":"FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day."
     },
     "android":{
       "notification":{
         "icon":"stock_ticker_update",
         "color":"#7e55c3"
       }
     }
   }
 }

مراجعه کنید HTTP اسناد مرجع V1 برای جزئیات کامل بر روی کلید های موجود در بلوک های پلت فرم خاص در متن پیام.

مثال: پیام اعلان با یک تصویر سفارشی

مثال زیر درخواست ارسال یک عنوان اعلان مشترک را به همه پلتفرم ها ارسال می کند، اما یک تصویر نیز ارسال می کند. در اینجا تقریبی از جلوه بصری روی دستگاه کاربر آورده شده است:

طراحی ساده یک تصویر در یک اعلان نمایشگر

Node.js

const topicName = 'industry-tech';

const message = {
  notification: {
    title: 'Sparky says hello!'
  },
  android: {
    notification: {
      imageUrl: 'https://foo.bar.pizza-monster.png'
    }
  },
  apns: {
    payload: {
      aps: {
        'mutable-content': 1
      }
    },
    fcm_options: {
      image: 'https://foo.bar.pizza-monster.png'
    }
  },
  webpush: {
    headers: {
      image: 'https://foo.bar.pizza-monster.png'
    }
  },
  topic: topicName,
};

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

باقی مانده

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

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
     "topic":"industry-tech",
     "notification":{
       "title":"Sparky says hello!",
     },
     "android":{
       "notification":{
         "image":"https://foo.bar/pizza-monster.png"
       }
     },
     "apns":{
       "payload":{
         "aps":{
           "mutable-content":1
         }
       },
       "fcm_options": {
           "image":"https://foo.bar/pizza-monster.png"
       }
     },
     "webpush":{
       "headers":{
         "image":"https://foo.bar/pizza-monster.png"
       }
     }
   }
 }

مراجعه کنید HTTP اسناد مرجع V1 برای جزئیات کامل بر روی کلید های موجود در بلوک های پلت فرم خاص در متن پیام.

مثال: پیام اعلان با یک اقدام کلیک مرتبط

مثال زیر درخواست ارسال یک عنوان اعلان مشترک را به همه پلتفرم‌ها ارسال می‌کند، اما همچنین اقدامی را برای برنامه ارسال می‌کند تا در پاسخ به تعامل کاربر با اعلان انجام دهد. در اینجا تقریبی از جلوه بصری روی دستگاه کاربر آورده شده است:

طراحی ساده یک ضربه کاربر برای باز کردن یک صفحه وب

Node.js

const topicName = 'industry-tech';

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

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

باقی مانده

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

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
     "topic":"industry-tech",
     "notification":{
       "title":"Breaking News...",
     },
     "android":{
       "notification":{
         "click_action":"news_intent"
       }
     },
     "apns":{
       "payload":{
         "aps":{
           "category" : "INVITE_CATEGORY"
         }
       },
     },
     "webpush":{
       "fcm_options":{
         "link":"breakingnews.html"
       }
     }
   }
 }

مراجعه کنید HTTP اسناد مرجع V1 برای جزئیات کامل بر روی کلید های موجود در بلوک های پلت فرم خاص در متن پیام.

مثال: پیام اعلان با گزینه های محلی سازی

مثال زیر درخواست ارسال گزینه‌های محلی‌سازی را برای مشتری ارسال می‌کند تا پیام‌های محلی را نمایش دهد. در اینجا تقریبی از جلوه بصری روی دستگاه کاربر آورده شده است:

طراحی ساده از دو دستگاه که متن را به زبان انگلیسی و اسپانیایی نشان می دهد

Node.js

var topicName = 'industry-tech';

var message = {
  android: {
    ttl: 3600000,
    notification: {
      bodyLocKey: 'STOCK_NOTIFICATION_BODY',
      bodyLocArgs: ['FooCorp', '11.80', '835.67', '1.43']
    }
  },
  apns: {
    payload: {
      aps: {
        alert: {
          locKey: 'STOCK_NOTIFICATION_BODY',
          locArgs: ['FooCorp', '11.80', '835.67', '1.43']
        }
      }
    }
  },
  topic: topicName,
};

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

باقی مانده

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

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
             "topic":"Tech",
             "android":{
               "ttl":"3600s",
               "notification":{
                 "body_loc_key": "STOCK_NOTIFICATION_BODY",
                 "body_loc_args":  ["FooCorp", "11.80", "835.67", "1.43"],
               },
             },
             "apns":{
               "payload":{
                 "aps":{
                   "alert" : {
                     "loc-key": "STOCK_NOTIFICATION_BODY",
                     "loc-args":  ["FooCorp", "11.80", "835.67", "1.43"],
                    },
                 },
               },
             },
  },
}'

مراجعه کنید HTTP اسناد مرجع V1 برای جزئیات کامل بر روی کلید های موجود در بلوک های پلت فرم خاص در متن پیام.

کدهای خطای ادمین

جدول زیر کدهای خطای Firebase Admin FCM API و توضیحات آنها، از جمله مراحل وضوح پیشنهادی را فهرست می‌کند.

کد خطا مراحل شرح و تفکیک
messaging/invalid-argument یک آرگومان نامعتبر به روش FCM ارائه شد. پیام خطا باید حاوی اطلاعات اضافی باشد.
messaging/invalid-recipient گیرنده پیام مورد نظر نامعتبر است. پیام خطا باید حاوی اطلاعات اضافی باشد.
messaging/invalid-payload یک شیء محموله پیام نامعتبر ارائه شد. پیام خطا باید حاوی اطلاعات اضافی باشد.
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 لغو ثبت کرد.
  • برنامه مشتری به طور خودکار لغو ثبت شد. اگر کاربر برنامه را حذف نصب کند یا در پلتفرم‌های اپل، اگر سرویس بازخورد APNs توکن APN را نامعتبر گزارش کرده باشد، ممکن است این اتفاق بیفتد.
  • ژتون ثبت نام منقضی شده است. برای مثال، ممکن است Google تصمیم بگیرد که نشانه‌های ثبت نام را به‌روزرسانی کند یا نشانه‌های APN ممکن است برای دستگاه‌های اپل منقضی شده باشد.
  • برنامه مشتری به روز شد، اما نسخه جدید برای دریافت پیام پیکربندی نشده است.
برای همه این موارد، این رمز ثبت نام را حذف کنید و استفاده از آن برای ارسال پیام را متوقف کنید.
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 APN های مورد نیاز آپلود نشده یا منقضی شده است. اعتبار گواهی های توسعه و تولید خود را بررسی کنید.
messaging/mismatched-credential اعتبار مورد استفاده برای احراز هویت این SDK مجوز ارسال پیام به دستگاه مربوط به رمز ثبت نام ارائه شده را ندارد. اطمینان حاصل کنید که اعتبار و رمز ثبت نام هر دو متعلق به یک پروژه Firebase هستند. مشاهده اضافه کردن فایربیس به برنامه شما برای اسناد در مورد چگونه به تصدیق فایربیس محیط مدیریت SDK ها.
messaging/authentication-error SDK نمی تواند در سرورهای FCM احراز هویت شود. اطمینان حاصل کنید که Firebase Admin SDK را با اعتباری که دارای مجوزهای مناسب برای ارسال پیام‌های FCM است، احراز هویت کنید. مشاهده اضافه کردن فایربیس به برنامه شما برای اسناد در مورد چگونه به تصدیق فایربیس محیط مدیریت SDK ها.
messaging/server-unavailable سرور FCM نتوانست به موقع درخواست را پردازش کند. شما باید همان درخواست را دوباره امتحان کنید، اما باید:
  • افتخار Retry-After هدر اگر آن را در پاسخ از FCM اتصال به سرور گنجانده شده است.
  • در مکانیسم تلاش مجدد خود، عقب نشینی نمایی را اجرا کنید. به عنوان مثال، اگر قبل از اولین تلاش مجدد یک ثانیه صبر کرده اید، حداقل دو ثانیه قبل از امتحان بعدی، سپس چهار ثانیه و غیره صبر کنید. اگر چندین پیام ارسال می کنید، هر کدام را به طور مستقل با مقدار تصادفی اضافی به تاخیر بیندازید تا از صدور درخواست جدید برای همه پیام ها به طور همزمان جلوگیری کنید.
فرستنده هایی که مشکل ایجاد می کنند در معرض خطر قرار گرفتن در لیست سیاه هستند.
messaging/internal-error سرور FCM هنگام تلاش برای پردازش درخواست با خطا مواجه شد. شما می توانید از همان درخواست زیر الزامات ذکر شده در دوباره سعی کنید messaging/server-unavailable سطر در بالا. اگر همچنان ادامه دارد خطا، لطفا گزارش مشکل را به ما گزارش اشکال کانال پشتیبانی می کند.
messaging/unknown-error یک خطای ناشناخته سرور برگردانده شد. برای جزئیات بیشتر پاسخ سرور خام را در پیام خطا مشاهده کنید. اگر شما این خطا را دریافت، لطفا گزارش پیام خطا کامل به ما گزارش اشکال کانال پشتیبانی می کند.

با استفاده از پروتکل‌های سرور برنامه قدیمی پیام‌ها را ارسال کنید

اگر ترجیح می دهید از پروتکل های قدیمی استفاده کنید، درخواست های پیام را همانطور که در این بخش نشان داده شده است بسازید. به خاطر داشته باشید که اگر از طریق HTTP به چندین پلتفرم ارسال می کنید، پروتکل v1 می تواند درخواست های پیام شما را ساده کند.

ارسال پیام به دستگاه های خاص

برای ارسال پیام به دستگاه های خاص، تنظیم to به ثبت نام Token برای نمونه برنامه خاص کلیدی است. برای کسب اطلاعات بیشتر در مورد نشانه های ثبت نام، اطلاعات راه اندازی مشتری برای پلتفرم خود را ببینید.

درخواست HTTP POST

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

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

پاسخ HTTP

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

پیام XMPP

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

پاسخ XMPP

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

سرور اتصال XMPP گزینه های دیگری را برای پاسخ ها فراهم می کند. مشاهده فرمت پاسخ سرور .

برای لیست کامل از گزینه های پیام موجود در هنگام ارسال پیام در پایین دست به برنامه های مشتری، اطلاعات مرجع برای اتصال به پروتکل سرور خود را انتخاب، و HTTP یا XMPP .

ارسال پیام به موضوعات

ارسال پیام به یک موضوع Firebase Cloud Messaging بسیار شبیه به ارسال پیام به یک دستگاه یا یک گروه کاربری است. مجموعه سرور برنامه to کلید با ارزش مانند /topics/yourTopic . : توسعه دهندگان می توانند هر نام موضوع که منطبق بر عبارت منظم را انتخاب نمایید "/topics/[a-zA-Z0-9-_.~%]+" .

برای ارسال به ترکیبی از موضوعات متعدد، سرور برنامه باید مجموعه condition کلیدی (به جای to کلید) را به یک وضعیت بولی که مشخص موضوعات مورد نظر. به عنوان مثال، برای ارسال پیام به دستگاه های که در آنها ثبت TopicA و یا TopicB یا TopicC :

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

FCM ابتدا هر شرایط داخل پرانتز را ارزیابی می کند و سپس عبارت را از چپ به راست ارزیابی می کند. در عبارت بالا، کاربری که در یک موضوع مشترک است، پیامی را دریافت نمی کند. به همین ترتیب، کاربری که در TopicA مشترک نمی شود، پیام را دریافت نمی کند. این ترکیبات آن را دریافت می کنند:

  • TopicA و TopicB
  • موضوع A و موضوع C

می توانید حداکثر پنج موضوع را در عبارت شرطی خود بگنجانید و پرانتزها پشتیبانی می شوند. اپراتورهای پشتیبانی شده: && ، || .

موضوع درخواست HTTP POST

ارسال به یک موضوع:

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


ارسال به دستگاه‌هایی که در موضوعات «سگ» یا «گربه» مشترک شده‌اند:

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


پاسخ HTTP موضوع

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

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

موضوع پیام XMPP

ارسال به یک موضوع:

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


  </gcm>
</message>

ارسال به دستگاه‌هایی که در موضوعات «سگ» یا «گربه» مشترک شده‌اند:

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


  </gcm>
</message>

پاسخ موضوع XMPP

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

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

قبل از اینکه سرور FCM یک پاسخ موفقیت آمیز یا ناموفق را به درخواست های ارسال موضوع ارسال کند، تا 30 ثانیه تاخیر انتظار داشته باشید. مطمئن شوید که مقدار مهلت زمانی سرور برنامه را در درخواست تنظیم کنید.

ارسال پیام به گروه های دستگاه

ارسال پیام به یک گروه دستگاه بسیار شبیه به ارسال پیام به یک دستگاه جداگانه است. تنظیم to پارامتر به کلید اطلاع رسانی منحصر به فرد برای گروه دستگاه. مشاهده انواع پیام برای جزئیات بیشتر در پشتیبانی محموله. مثال‌های موجود در این صفحه نحوه ارسال پیام‌های داده به گروه‌های دستگاه در پروتکل‌های HTTP و XMPP را نشان می‌دهند.

درخواست HTTP POST گروه دستگاه

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

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

پاسخ HTTP گروه دستگاه

اینجا یک مثال از "موفقیت" است - notification_key دارای 2 نشانه ثبت نام در ارتباط با آن، و پیام موفقیت برای هر دو آنها ارسال شده است:

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

اینجا یک مثال از "موفقیت نسبی" است - notification_key دارای 3 ثبت نام نشانه با آن همراه است. پیام فقط به یکی از نشانه های ثبت نام با موفقیت ارسال شد. لیست پیام پاسخ نشانه ثبت نام ( registration_ids ) که موفق به دریافت پیام:

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

زمانی که یک پیام نتواند به به یک یا چند از ثبت نام نشانه با یک همراه تحویل داده می شود notification_key ، سرور برنامه باید با backoff بین مجدد دوباره سعی کنید.

اگر سرور بخواهد پیامی را به گروه دستگاهی که هیچ عضوی ندارد ارسال کند، پاسخ به شکل زیر است، با 0 موفقیت و 0 شکست:

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

پیام XMPP گروه دستگاه

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

پاسخ XMPP گروه دستگاه

هنگامی که پیام با موفقیت به یکی از دستگاه های گروه ارسال می شود، سرور اتصال XMPP با یک ACK پاسخ می دهد. اگر همه پیام‌های ارسال شده به همه دستگاه‌های گروه ناموفق باشند، سرور اتصال XMPP با NACK پاسخ می‌دهد.

اینجا یک مثال از "موفقیت" است - notification_key دارای 3 نشانه ثبت نام در ارتباط با آن، و پیام موفقیت را به همه آنها ارسال شده است:

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

اینجا یک مثال از "موفقیت نسبی" است - notification_key دارای 3 ثبت نام نشانه با آن همراه است. پیام فقط به یکی از نشانه های ثبت نام با موفقیت ارسال شد. پیام پاسخ، نشانه های ثبت نامی را که پیام را دریافت نکرده اند فهرست می کند:

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

وقتی سرور اتصال FCM نتواند به همه دستگاه‌های گروه تحویل دهد. سرور برنامه یک پاسخ ناک دریافت خواهد کرد.

برای لیست کامل از گزینه های پیام، اطلاعات مرجع برای اتصال به پروتکل سرور خود را انتخاب، و HTTP یا XMPP .

روش‌های ارسال قدیمی Firebase Admin SDK

فایربیس محیط مدیریت Node.js و SDK از روش برای ارسال (FCM) پیام بر اساس API سرور میراث FCM . این روش را قبول استدلال های مختلف نسبت به 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 خطاها API .

ارسال به گروه دستگاه

پیام‌رسانی گروه دستگاه به شما امکان می‌دهد چندین دستگاه را به یک گروه اضافه کنید. این شبیه به پیام‌رسانی موضوع است، اما شامل احراز هویت است تا اطمینان حاصل شود که عضویت گروه فقط توسط سرورهای شما مدیریت می‌شود. به عنوان مثال، اگر می خواهید پیام های مختلفی را به مدل های مختلف تلفن ارسال کنید، سرورهای شما می توانند ثبت نام ها را به گروه های مربوطه اضافه یا حذف کنند و پیام مناسب را برای هر گروه ارسال کنند. پیام‌رسانی گروه دستگاه با پیام‌رسانی موضوعی متفاوت است زیرا شامل مدیریت گروه‌های دستگاه از سرورهای شما به جای مستقیماً در برنامه شما است.

شما می توانید پیام های گروه دستگاه از طریق میراث استفاده XMPP یا HTTP پروتکل خوشحال برنامه شما. فایربیس SDK محیط مدیریت برای Node.js. بر اساس پروتکل های میراث همچنین قابلیت های پیام رسانی گروه دستگاه فراهم می کند. حداکثر تعداد اعضای مجاز برای یک کلید اعلان 20 نفر است.

می‌توانید گروه‌های دستگاه ایجاد کنید و کلیدهای اعلان را از طریق یک سرور برنامه یا یک کلاینت Android ایجاد کنید. مشاهده مدیریت گروه دستگاه برای جزئیات بیشتر.

sendToDeviceGroup() روش اجازه می دهد تا شما را به ارسال یک پیام به یک گروه دستگاه را بوسیله کلید اخطار برای آن گروه دستگاه:

Node.js

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

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

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

sendToDeviceGroup() روش وعده است که با حل و فصل می گرداند MessagingDevicesResponse شیء شامل پاسخ از FCM.

برخی از موارد مانند خطای احراز هویت یا محدود کردن نرخ باعث می شود که کل پیام پردازش نشود. در این موارد، وعده بازگردانده شده توسط sendToDeviceGroup() با یک خطا را رد کرد. برای یک لیست کامل از کدهای خطا، از جمله شرح و مراحل وضوح، و مدیریت FCM خطاها API .

تعریف محموله پیام

روش های فوق بر اساس پروتکل 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 برای یک لیست کامل از گزینه های موجود.