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

برای عناوین مربوط به Unity پیام ارسال کنید

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

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

نکاتی که باید در مورد موضوعات رعایت شود:

  • پیام های موضوعی برای محتواهایی مانند آب و هوا یا سایر اطلاعات عمومی در دسترس است.
  • پیام از موضوعات را برای توان به جای تاخیر بهینه شده است. برای سریع، تحویل امن به دستگاه های تک یا گروه های کوچک از دستگاه های، پیام هدف به نشانه ثبت نام ، نه موضوع است.
  • اگر شما نیاز به ارسال پیام به دستگاه های مختلف برای هر کاربر، در نظر پیام های گروه دستگاه برای کسانی که موارد استفاده کنید.
  • پیام های موضوعی از اشتراک نامحدود برای هر موضوع پشتیبانی می کند. با این حال ، FCM محدودیت هایی را در این زمینه اعمال می کند:
    • یک نمونه برنامه را می توان در بیش از 2000 موضوع مشترک کرد.
    • اگر شما با استفاده واردات دسته ای برای عضویت در نمونه برنامه، هر یک درخواست به 1000 نمونه برنامه های محدود شده است.
    • فراوانی اشتراک های جدید در هر پروژه محدود به نرخ است. اگر شما بیش از حد بسیاری از درخواست اشتراک ارسال در یک دوره کوتاه از زمان، سرور FCM با پاسخ خواهد داد 429 RESOURCE_EXHAUSTED ( "بیش از سهمیه مجاز") استفاده نمود. دوباره امتحان کنید.

برنامه مشتری را در یک موضوع مشترک کنید

برای عضویت در یک موضوع، پاسخ Firebase.Messaging.FirebaseMessaging.Subscribe از برنامه خود را. این یک درخواست ناهمزمان از باطن FCM می کند و مشتری را در موضوع مورد نظر مشترک می کند.

Firebase.Messaging.FirebaseMessaging.Subscribe("/topics/example");

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

برای لغو اشتراک، پاسخ Firebase.Messaging.FirebaseMessaging.Unsubscribe و FCM لغو اشتراک از موضوع در پس زمینه.

مدیریت اشتراک موضوعات در سرور

فایربیس محیط مدیریت SDK اجازه می دهد تا شما را به انجام اساسی وظایف مدیریت موضوع را از سمت سرور. با توجه به نشانه (های) ثبت نام آنها ، می توانید نمونه برنامه های سرویس گیرنده را به صورت انبوه با استفاده از منطق سرور مشترک و لغو کنید.

می توانید نمونه برنامه های مشتری را در هر موضوع موجود مشترک کنید ، یا می توانید یک موضوع جدید ایجاد کنید. وقتی از API برای مشترک شدن یک برنامه مشتری در یک موضوع جدید (موضوعی که قبلاً برای پروژه Firebase شما وجود ندارد) استفاده می کنید ، یک موضوع جدید با این نام در FCM ایجاد می شود و هر مشتری می تواند متعاقباً در آن مشترک شود.

می توانید لیستی از نشانه های ثبت نام را به روش اشتراک Firebase Admin SDK منتقل کنید تا دستگاه های مربوطه را در یک موضوع مشترک کنید:

Node.js

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

// Subscribe the devices corresponding to the registration tokens to the
// topic.
getMessaging().subscribeToTopic(registrationTokens, topic)
  .then((response) => {
    // See the MessagingTopicManagementResponse reference documentation
    // for the contents of response.
    console.log('Successfully subscribed to topic:', response);
  })
  .catch((error) => {
    console.log('Error subscribing to topic:', error);
  });

جاوا

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

// Subscribe the devices corresponding to the registration tokens to the
// topic.
TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopic(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " tokens were subscribed successfully");

پایتون

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

# Subscribe the devices corresponding to the registration tokens to the
# topic.
response = messaging.subscribe_to_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were subscribed successfully')

برو

// These registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}

// Subscribe the devices corresponding to the registration tokens to the
// topic.
response, err := client.SubscribeToTopic(ctx, registrationTokens, topic)
if err != nil {
	log.Fatalln(err)
}
// See the TopicManagementResponse reference documentation
// for the contents of response.
fmt.Println(response.SuccessCount, "tokens were subscribed successfully")

سی شارپ

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};

// Subscribe the devices corresponding to the registration tokens to the
// topic
var response = await FirebaseMessaging.DefaultInstance.SubscribeToTopicAsync(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} tokens were subscribed successfully");

API Admin FCM همچنین به شما امکان می دهد با انتقال نشانه های ثبت نام به روش مناسب ، اشتراک دستگاه ها را از یک موضوع لغو کنید:

Node.js

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

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
getMessaging().unsubscribeFromTopic(registrationTokens, topic)
  .then((response) => {
    // See the MessagingTopicManagementResponse reference documentation
    // for the contents of response.
    console.log('Successfully unsubscribed from topic:', response);
  })
  .catch((error) => {
    console.log('Error unsubscribing from topic:', error);
  });

جاوا

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

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
TopicManagementResponse response = FirebaseMessaging.getInstance().unsubscribeFromTopic(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
System.out.println(response.getSuccessCount() + " tokens were unsubscribed successfully");

پایتون

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

# Unubscribe the devices corresponding to the registration tokens from the
# topic.
response = messaging.unsubscribe_from_topic(registration_tokens, topic)
# See the TopicManagementResponse reference documentation
# for the contents of response.
print(response.success_count, 'tokens were unsubscribed successfully')

برو

// These registration tokens come from the client FCM SDKs.
registrationTokens := []string{
	"YOUR_REGISTRATION_TOKEN_1",
	// ...
	"YOUR_REGISTRATION_TOKEN_n",
}

// Unsubscribe the devices corresponding to the registration tokens from
// the topic.
response, err := client.UnsubscribeFromTopic(ctx, registrationTokens, topic)
if err != nil {
	log.Fatalln(err)
}
// See the TopicManagementResponse reference documentation
// for the contents of response.
fmt.Println(response.SuccessCount, "tokens were unsubscribed successfully")

سی شارپ

// These registration tokens come from the client FCM SDKs.
var registrationTokens = new List<string>()
{
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n",
};

// Unsubscribe the devices corresponding to the registration tokens from the
// topic
var response = await FirebaseMessaging.DefaultInstance.UnsubscribeFromTopicAsync(
    registrationTokens, topic);
// See the TopicManagementResponse reference documentation
// for the contents of response.
Console.WriteLine($"{response.SuccessCount} tokens were unsubscribed successfully");

subscribeToTopic() و unsubscribeFromTopic() روش نتایج در یک شیء شامل پاسخ از FCM. نوع بازگشت بدون در نظر گرفتن تعداد توکن های ثبت شده در درخواست دارای همان فرمت است.

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

دریافت و مدیریت پیام های موضوعی

FCM پیامهای موضوعی را مانند سایر پیامهای پایین دست ارائه می دهد.

با مشترک شدن در رویداد Firebase.Messaging.FirebaseMessaging.MessageReceived شما می توانید اقدامات بر اساس پیام دریافت شده انجام و داده های پیام.

Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;

...

public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  UnityEngine.Debug.Log("Received a new message");
  if (e.Message.From.Length > 0)
    UnityEngine.Debug.Log("from: " + e.Message.From);
  if (e.Message.Data.Count > 0) {
    UnityEngine.Debug.Log("data:");
    foreach (System.Collections.Generic.KeyValuePair iter in
             e.Message.Data) {
      UnityEngine.Debug.Log("  " + iter.Key + ": " + iter.Value);
    }
  }
}

ساخت درخواست های ارسال

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

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

Node.js

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

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

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

جاوا

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

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

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

پایتون

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

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

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

برو

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

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

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

سی شارپ

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

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

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

باقی مانده

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

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

دستور cURL:

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

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

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

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

  • TopicA و TopicB
  • TopicA و TopicC

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

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

Node.js

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

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

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

جاوا

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

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

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

پایتون

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

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

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

برو

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

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

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

سی شارپ

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

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

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

باقی مانده

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

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

دستور cURL:

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

مراحل بعدی