Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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

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

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

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

דוגמאות בעמוד זה מראות כיצד לשלוח הודעות התראה באמצעות Firebase Admin SDK (בעל תמיכה ב- Node , 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.
admin.messaging().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 של מנהל ה- 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,
};

admin.messaging().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

עבור ערכות SDK של sendAll() Firebase, פעולה זו משתמשת sendAll() API של sendAll() מתחת למכסה המנוע, כפי שמוצג בדוגמאות. ערך ההחזרה הוא 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,
};

admin.messaging().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.
admin.messaging().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 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.
admin.messaging().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

שלח קבוצה של הודעות

ממשקי ה- API של REST ו- SDK 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',
});

admin.messaging().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 או ממשקי 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,
    },
}

שלח באמצעות FCM HTTP API מדור קודם

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

להלן הערכה של ההשפעה החזותית על מכשיר המשתמש:

Node.js

const topicName = 'industry-tech';

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

admin.messaging().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"
       }
     }
   }
 }

עיין בתיעוד ההפניה של 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,
};

admin.messaging().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,
};

admin.messaging().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,
};

admin.messaging().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.
  • אפליקציית הלקוח בוטלה אוטומטית. זה יכול לקרות אם המשתמש מסיר את ההתקנה של היישום, או ב- iOS, אם שירות המשוב של APNs דיווח על אסימון ה- APN כלא חוקי.
  • פג תוקף אסימון ההרשמה. לדוגמא, גוגל עשויה להחליט לרענן אסימוני רישום או שאסימון ה- APN פג במכשירי iOS.
  • אפליקציית הלקוח עודכנה, אך הגרסה החדשה אינה מוגדרת לקבלת הודעות.
בכל המקרים הללו, הסר את אסימון הרישום הזה והפסיק להשתמש בו לשליחת הודעות.
messaging/invalid-package-name ההודעה הופנתה לאסימון רישום ששמו החבילה אינו תואם את האפשרות restrictedPackageName PackageName שסופקה.
messaging/message-rate-exceeded קצב ההודעות ליעד מסוים גבוה מדי. צמצם את מספר ההודעות שנשלחו למכשיר או נושא זה ואל תנסה מיד לשלוח ליעד זה.
messaging/device-message-rate-exceeded קצב ההודעות למכשיר מסוים גבוה מדי. צמצם את מספר ההודעות שנשלחו למכשיר זה ואל תנסה מיד לשלוח שוב למכשיר זה.
messaging/topics-message-rate-exceeded שיעור ההודעות למנויים בנושא מסוים גבוה מדי. צמצם את מספר ההודעות שנשלחו לנושא זה, ואל תנסה מיד לשלוח לנושא זה.
messaging/too-many-topics אסימון רישום נרשם למספר הנושאים המרבי ולא ניתן להירשם אליו יותר.
messaging/invalid-apns-credentials לא ניתן היה לשלוח הודעה הממוקדת למכשיר iOS מכיוון שאישור ה- SSL הנדרש של APNs לא הועלה או פג תוקפו. בדוק את תקפות אישורי הפיתוח והייצור שלך.
messaging/mismatched-credential לאישור המשמש לאימות SDK זה אין הרשאה לשלוח הודעות למכשיר המתאימות לאסימון הרישום שסופק. וודא כי אישורי האישור ואסימון הרישום שייכים לאותו פרויקט Firebase. ראה הוסף Firebase לאפליקציה שלך לקבלת תיעוד כיצד לאמת את ערכות ה- SDK של מנהל ה- Firebase.
messaging/authentication-error SDK לא הצליח לאמת את שרתי ה- FCM. ודא שאתה מאמת את ה- SDK למנהל המערכת של Firebase באמצעות אישורים שיש להם הרשאות מתאימות לשליחת הודעות FCM. ראה הוסף Firebase לאפליקציה שלך לקבלת תיעוד כיצד לאמת את ערכות ה- SDK של מנהל המערכת של Firebase.
messaging/server-unavailable שרת ה- FCM לא הצליח לעבד את הבקשה בזמן. עליך לנסות שוב את אותה בקשה, אך עליך:
  • כבד את Retry-After הכותרת אם זה נכלל התגובה משרת חיבור FCM.
  • יישם גיבוי מעריכי במנגנון הניסיון שלך מחדש. לדוגמא, אם חיכית שנייה לפני הניסיון הראשון, המתן לפחות שתי שניות לפני השניה הבאה, ואז ארבע שניות וכן הלאה. אם אתה שולח מספר הודעות, עיכוב כל אחת מהן באופן עצמאי בכמות אקראית נוספת כדי להימנע מלהגיש בקשה חדשה לכל ההודעות בו זמנית.
שולחים הגורמים לבעיות מסתכנים ברשימה השחורה.
messaging/internal-error שרת FCM נתקל בשגיאה בעת ניסיון לעבד את הבקשה. תוכל לנסות שוב את אותה בקשה בהתאם לדרישות המופיעות בשורה messaging/server-unavailable לעיל. אם השגיאה נמשכת, אנא דווח על הבעיה לערוץ התמיכה של Bug Report .
messaging/unknown-error שגיאת שרת לא ידועה הוחזרה. ראה את תגובת השרת הגולמי בהודעת השגיאה לקבלת פרטים נוספים. אם אתה מקבל שגיאה זו, אנא דווח על הודעת השגיאה המלאה לערוץ התמיכה של Bug Report .

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

אם אתה מעדיף להשתמש בפרוטוקולים מדור קודם, בנה בקשות להודעות כפי שמוצג בסעיף זה. זכור שאם אתה שולח למספר פלטפורמות באמצעות 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 דומה מאוד למשלוח הודעות למכשיר בודד או לקבוצת משתמשים. שרת האפליקציות מגדיר את מקש ה- to עם ערך כמו /topics/yourTopic . מפתחים יכולים לבחור כל שם נושא שתואם לביטוי הרגולרי: "/topics/[a-zA-Z0-9-_.~%]+" . "/topics/[a-zA-Z0-9-_.~%]+" .

כדי לשלוח שילובים של נושאים מרובים, שרת האפליקציה חייב להגדיר את condition המפתח (במקום to מפתח) למצב בוליאני המציין את נושאי היעד. לדוגמה, כדי לשלוח הודעות למכשירים שמנויים ל- TopicA ו- TopicB או TopicC :

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

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

  • נושא A ונושא B.
  • TopicA ו- TopicC

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

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

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

לרשימת אפשרויות ההודעה המלאה, עיין במידע ההתייחסות עבור פרוטוקול שרת החיבור שבחרת, HTTP או XMPP .

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

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

לרשימת אפשרויות ההודעה המלאה, עיין במידע ההתייחסות עבור פרוטוקול שרת החיבור שבחרת, HTTP או XMPP .

שיטות שליחה מדור קודם של Firebase Admin SDK

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

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

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

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

באפשרותך להשתמש בהודעות של קבוצות מכשירים באמצעות פרוטוקולי XMPP או HTTP מדור קודם בשרת האפליקציה שלך. Firkase 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.
admin.messaging().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() מחזירה הבטחה sendToDeviceGroup() באמצעות אובייקט MessagingDeviceGroupResponse המכיל את התגובה מ- FCM.

מקרים מסוימים כגון שגיאת אימות או הגבלת קצב גורמים להעברת מכלול ההודעה. במקרים אלה ההבטחה שהוחזרה על ידי sendToDeviceGroup() נדחית בשגיאה. לקבלת רשימה מלאה של קודי שגיאה, כולל תיאורים ושלבי רזולוציה, ראה Admin 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 ההתייחסות של 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.
admin.messaging().sendToDevice(registrationToken, payload, options)
  .then((response) => {
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

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