Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

בנה בקשות לשלוח שרת אפליקציות

באמצעות פרוטוקולי שרת היישומים של Firebase Admin SDK או FCM, תוכל לבנות בקשות הודעות ולשלוח אותן ליעדים מסוג זה:

  • שם הנושא
  • מַצָב
  • אסימון רישום מכשירים
  • שם קבוצת מכשירים (פרוטוקולים מדור קודם ו- SDK מנהל מערכת של Firebase עבור Node.js בלבד)

אתה יכול לשלוח הודעות עם מטען התראה המורכב משדות מוגדרים מראש, מטען נתונים של שדות שהוגדרו על ידי המשתמש שלך, או הודעה המכילה את שני סוגי המטען. ראה סוגי הודעות לקבלת מידע נוסף.

דוגמאות דף זה מראה כיצד לשלוח הודעות הודעות באמצעות SDK של ניהול Firebase (אשר יש תמיכת צומת , Java , Python , C # , ו Go ) ואת פרוטוקול HTTP v1 . יש גם הדרכה עבור שליחת הודעות דרך 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)

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

מנוחה

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 Admin Firebase מחזיר את המחרוזת מזהה במתכונת projects/{project_id}/messages/{message_id} . תגובת פרוטוקול HTTP היא מפתח JSON יחיד:

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

שלח הודעות למספר מכשירים

ממשק ה- API של REST וממשקי ה- API של Admin 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");

פִּיתוֹן

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

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

ללכת

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

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

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

C#

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

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

מנוחה

בנה בקשת אצווה של 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

ערכות פיתוח התוכנה Admin Firebase, פעולה זו משתמשת 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 100 registration tokens.
// This registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}
message := &messaging.MulticastMessage{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Tokens: registrationTokens,
}

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

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

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

C#

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

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

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

מנוחה

כל שליחת תת שליחה של שליחה מחזירה תגובה. תגובות מופרדות על ידי מחרוזת גבול בתגובה החל --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)

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

מנוחה

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)

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

מנוחה

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 ו- SDKs Admin תומכים בשליחת הודעות בקבוצות. אתה יכול לקבץ עד 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 100 messages.
messages := []*messaging.Message{
	{
		Notification: &messaging.Notification{
			Title: "Price drop",
			Body:  "5% off all electronics",
		},
		Token: registrationToken,
	},
	{
		Notification: &messaging.Notification{
			Title: "Price drop",
			Body:  "2% off all books",
		},
		Topic: "readers-club",
	},
}

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

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

C#

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

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

מנוחה

בנה בקשת אצווה 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 או 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,
    },
}

שלח באמצעות ממשק ה- 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 Admin Firebase ופרוטוקול FCM v1 HTTP הוא מאפשרים בקשות ההודעה שלך להגדיר את כול שדות זמינים message האובייקט. זה כולל:

  • סט של שדות נפוץ להתפרש על ידי כול מופעי האפליקציה אשר מקבלים את המסר.
  • סטים ספציפי פלטפורמה של שדות, כגון AndroidConfig ו WebpushConfig , לפרש רק במקרי אפליקציה פועלים על הפלטפורמה שצוינה.

בלוקים ספציפיים לפלטפורמה נותנים לך גמישות להתאים אישית הודעות לפלטפורמות שונות כדי לוודא שמטפלים בהן כראוי כאשר הן מתקבלות. ה- backend של ה- FCM ייקח בחשבון את כל הפרמטרים שצוינו ויתאים את ההודעה לכל פלטפורמה.

מתי להשתמש בשדות משותפים

השתמש בשדות נפוצים כאשר אתה:

  • מיקוד מקרים האפליקציה בכל הפלטפורמות - iOS, Android, אינטרנט
  • שליחת הודעות לנושאים

כל מופעי האפליקציות, ללא קשר לפלטפורמה, יכולים לפרש את השדות הנפוצים הבאים:

מתי להשתמש בשדות ספציפיים לפלטפורמה

השתמש בשדות ספציפיים לפלטפורמה כאשר אתה רוצה:

  • שלח שדות רק לפלטפורמות מסוימות
  • שלח שדות פלטפורמה ספציפיים בנוסף לשדות הנפוצים

בכול פעם שאתה רוצה לשלוח ערכים רק לפלטפורמות בפרט, לא להשתמש בשדות משותפים; להשתמש בשדות ספציפיים לפלטפורמה. לדוגמה, כדי לשלוח הודעה רק ל- iOS והאינטרנט אך לא ל- Android, עליך להשתמש בשתי קבוצות נפרדות של שדות, אחד עבור iOS ואחד עבור האינטרנט.

כאשר אתה שולח הודעות עם ספציפיים אפשרויות משלוח , שדות ספציפיים פלטפורמה לשימוש להגדיר אותם. אתה יכול לציין ערכים שונים לפלטפורמה אם תרצה. עם זאת, גם כאשר אתה רוצה להגדיר את אותו ערך בעצם על פני פלטפורמות, עליך להשתמש בשדות ספציפיים לפלטפורמה. הסיבה לכך היא כול פלטפורמה עשוי לפרש את הערך באופן מעט שונה, למשל, זמן-כדי-חיים מוגדר על אנדרואיד כמו זמן תפוגה בתוך שניות, ואילו על iOS הוא מוגדר בתור תאריך תפוגה.

דוגמה: הודעת התראה עם אפשרויות צבע וסמל

בקשה למשלוח שליחה זו שולחת כותרת ותוכן משותפים לכל הפלטפורמות, אך היא גם שולחת כמה דריסות ספציפיות לפלטפורמה למכשירי Android.

עבור Android, הבקשה קובעת סמל וצבע מיוחדים להצגה במכשירי Android. כפי שצוינו התייחסות AndroidNotification , הצבע מצוין בפורמט #rrggbb, ואת התמונה חייבת להיות משאב סמל drawable מקומי אל אפליקציית אנדרואיד.

להלן קירוב של האפקט החזותי במכשיר של משתמש:

ציור פשוט של שני מכשירים, כאשר אחד מציג סמל וצבע מותאמים אישית

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

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

מנוחה

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

עיין בתיעוד עזר v1 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);
  });

מנוחה

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

עיין בתיעוד עזר v1 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);
  });

מנוחה

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

עיין בתיעוד עזר v1 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);
  });

מנוחה

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

עיין בתיעוד עזר v1 HTTP עבור פירוט מלא על המפתחות הזמינים בבלוקי פלטפורמה ספציפיים בגוף ההודעה.

קודי שגיאה של מנהל מערכת

הטבלה הבאה מפרטת את קודי השגיאה של מנהל המערכת של Firebase FCM API ואת התיאורים שלהם, כולל שלבי פתרון מומלצים.

קוד שגיאה שלבי תיאור ורזולוציה
messaging/invalid-argument טענה לא חוקית נמסרה לשיטת FCM. הודעת השגיאה צריכה להכיל מידע נוסף.
messaging/invalid-recipient מקבל ההודעה המיועד אינו חוקי. הודעת השגיאה צריכה להכיל מידע נוסף.
messaging/invalid-payload סופק אובייקט מטען של הודעה לא חוקית. הודעת השגיאה צריכה להכיל מידע נוסף.
messaging/invalid-data-payload-key המטען של הודעת הנתונים מכיל מפתח לא חוקי. עיין בתיעוד התייחסות DataMessagePayload מפתחות מוגבלים.
messaging/payload-size-limit-exceeded מטען ההודעות שסופק חורג ממגבלות גודל ה- FCM. המגבלה היא 4096 בתים עבור רוב ההודעות. עבור הודעות שנשלחות לנושאים, המגבלה היא 2048 בתים. גודל המטען הכולל כולל גם מפתחות וגם ערכים.
messaging/invalid-options סופק אובייקט לא חוקי של הודעות. הודעת השגיאה צריכה להכיל מידע נוסף.
messaging/invalid-registration-token סופק אסימון הרשמה לא חוקי. וודא שהוא תואם לאסימון הרישום שאפליקציית הלקוח מקבלת מההרשמה ל- FCM. אין לחתוך או להוסיף לו תווים נוספים.
messaging/registration-token-not-registered אסימון הרישום שסופק אינו רשום. ניתן לבטל את רישום אסימון הרישום שהיה תקף בעבר מסיבות שונות, כולל:
  • אפליקציית הלקוח ביטלה את הרישום שלה מ- FCM.
  • אפליקציית הלקוח לא נרשמה אוטומטית. זה יכול לקרות אם המשתמש מסיר את ההתקנה של היישום או, ב- iOS, אם שירות המשוב של APN דיווח על אסימון ה- APN כבלתי חוקי.
  • פג תוקפו של אסימון הרישום. לדוגמה, Google עשויה להחליט לרענן אסימוני רישום או שפג תוקפן של אסימון APN למכשירי iOS.
  • אפליקציית הלקוח עודכנה, אך הגרסה החדשה אינה מוגדרת לקבלת הודעות.
בכל המקרים הללו, הסר אסימון רישום זה והפסק להשתמש בו כדי לשלוח הודעות.
messaging/invalid-package-name המסר שהופנה אסימון שרישומו שם החבילה אינו תואם סיפק restrictedPackageName האופציה.
messaging/message-rate-exceeded שיעור ההודעות ליעד מסוים גבוה מדי. צמצם את מספר ההודעות שנשלחות למכשיר או לנושא זה ואל תנסה שוב לשלוח ליעד זה מיד.
messaging/device-message-rate-exceeded שיעור ההודעות למכשיר מסוים גבוה מדי. צמצם את מספר ההודעות שנשלחות למכשיר זה ואל תנסה מיד לשלוח אותו שוב למכשיר זה.
messaging/topics-message-rate-exceeded שיעור ההודעות למנויים לנושא מסוים גבוה מדי. צמצם את מספר ההודעות שנשלחו לנושא זה, ואל תנסה שוב לשלוח לנושא זה מיד.
messaging/too-many-topics אסימון הרשמה נרשם למספר הנושאים המרבי ולא ניתן להירשם אליו יותר.
messaging/invalid-apns-credentials לא ניתן היה לשלוח הודעה הממוקדת למכשיר iOS מכיוון שתעודת ה- SSL הנדרשת של APN לא הועלתה או שתוקפה פג. בדוק את תוקף תעודות הפיתוח והייצור שלך.
messaging/mismatched-credential לאישור המשמש לאימות SDK זה אין הרשאה לשלוח הודעות למכשיר המתאימות לאסימון הרישום שסופק. וודא כי אסימון האישור ורישום שניהם שייכים לאותו פרויקט Firebase. ראה להוסיף Firebase באפליקציה עבור תיעוד על כיצד לאמת בערכות הפיתוח Admin Firebase.
messaging/authentication-error SDK לא הצליח לאמת לשרתי FCM. וודא שאתה מאמת את ה- SDK לניהול ה- Firebase עם אישור בעל הרשאות מתאימות לשליחת הודעות FCM. ראה להוסיף Firebase באפליקציה עבור תיעוד על כיצד לאמת בערכות הפיתוח Admin Firebase.
messaging/server-unavailable שרת ה- FCM לא הצליח לעבד את הבקשה בזמן. עליך לנסות שוב את אותה הבקשה, אך עליך:
  • כבד את Retry-After הכותרת אם זה נכלל התגובה משרת חיבור FCM.
  • יישום גיבוי מעריכי במנגנון הניסוי החוזר שלך. לדוגמה, אם חיכית שנייה אחת לפני הניסוי הראשון, המתן שתי שניות לפחות לפני השניה הבאה, ולאחר מכן ארבע שניות וכן הלאה. אם אתה שולח מספר הודעות, דחה כל אחת בנפרד בסכום אקראי נוסף כדי להימנע מהגשת בקשה חדשה לכל ההודעות בו זמנית.
שולחים הגורמים לבעיות מסתכנים ברשימה השחורה.
messaging/internal-error שרת ה- FCM נתקל בשגיאה בעת ניסיון לעבד את הבקשה. אתה יכול לנסות שוב את אותה הבקשה הבאה הדרישות המופיעות messaging/server-unavailable שורה מעל. אם נמשך השגיאה, אנא דווח על הבעיה שלנו דיווחעלבאג ערוץ התמיכה.
messaging/unknown-error שגיאת שרת לא ידועה הוחזרה. עיין בתגובת השרת הגולמי בהודעת השגיאה לפרטים נוספים. אם אתה מקבל שגיאה זו, נא לדווח את הודעת השגיאה המלאה שלנו דיווחעלבאג ערוץ תמיכה.

שלח הודעות באמצעות פרוטוקולי שרת אפליקציות מדור קודם

אם אתה מעדיף להשתמש בפרוטוקולים מדור קודם, בנה בקשות הודעות כפי שמוצג בסעיף זה. זכור שאם אתה שולח למספר פלטפורמות באמצעות HTTP, פרוטוקול v1 יכול לפשט את בקשות ההודעות שלך.

שלח הודעות למכשירים ספציפיים

כדי לשלוח הודעות למכשירים ספציפיים, להגדיר את 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 אינו מקבל את ההודעה. השילובים האלה אכן מקבלים את זה:

  • TopicA ו- TopicB
  • TopicA ו- TopicC

תוכל לכלול עד חמישה נושאים בביטוי המותנה שלך, וסוגריים נתמכים. מפעילים נתמכים: && , || .

בקשת 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 יש 2 אסימונים רישום הקשורים אליו, ואת ההודעה נשלחה בהצלחה לשניהם:

{
  "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 SDK

Firebase Admin Node.js SDK תומך בשיטות לשליחה (FCM) הודעות מבוססות על ה- API של שרת Legacy 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() נדחית עם שגיאה. לקבלת רשימה מלאה של קודי שגיאה, כולל תיאורים צעדים רזולוציה, לראות שגיאות API FCM Admin .

שלח לקבוצת מכשירים

העברת הודעות בקבוצת מכשירים מאפשרת להוסיף מספר מכשירים לקבוצה אחת. הדבר דומה להודעות בנושא, אך כולל אימות כדי להבטיח שחברות בקבוצה מנוהלת רק על ידי השרתים שלך. לדוגמה, אם ברצונך לשלוח הודעות שונות לדגמי טלפונים שונים, השרתים שלך יכולים להוסיף/להסיר רישומים לקבוצות המתאימות ולשלוח את ההודעה המתאימה לכל קבוצה. העברת קבוצות התקנים שונה מהודעות נושאים בכך שהיא כרוכה בניהול קבוצות מכשירים מהשרתים שלך במקום ישירות בתוך היישום שלך.

אתה יכול להשתמש בהודעות קבוצת מכשיר דרך המורשית XMPP או HTTP פרוטוקולים בשרת האפליקציה שלך. Firebase Admin SDK עבור Node.js מבוסס על פרוטוקולי מורשתו גם לספק יכולות העברת הודעות קבוצתיות מכשיר. מספר החברים המרבי המותר למפתח הודעה הוא 20.

תוכל ליצור קבוצות מכשירים ולייצר מפתחות התראה באמצעות שרת אפליקציות או לקוח אנדרואיד. ראה ניהול קבוצות מכשיר לפרטים.

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() שיטה מחזירה הבטחה כי נפתרה עם MessagingDeviceGroupResponse אובייקט המכיל את תגובת FCM.

מקרים מסוימים כגון שגיאת אימות או הגבלת קצב גורמים לעיבוד שלם של ההודעה. במקרים אלה, ההבטחה שמחזירה sendToDeviceGroup() נדחית עם שגיאה. לקבלת רשימה מלאה של קודי שגיאה, כולל תיאורים צעדים רזולוציה, לראות שגיאות API FCM Admin .

הגדרת מטען ההודעה

השיטות לעיל המבוססות על פרוטוקולי מורשת 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'
  }
};

מטענים בהודעות הודעה כוללים קבוצת משנה מוגדרת מראש של נכסים תקפים ומשתנים מעט בהתאם למערכת ההפעלה הניידת שאליה אתה ממקד. עיין Docs התייחסות NotificationMessagePayload עבור רשימה מלאה.

מטענים של הודעות נתונים מורכבים מזוגות ערך-ערך מותאמים אישית עם מספר מגבלות, כולל העובדה שכל הערכים חייבים להיות מחרוזות. עיין Docs התייחסות 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);
  });

עיין Docs התייחסות MessagingOptions לקבלת רשימה מלאה של אפשרויות זמינות.