بر اساس مدل انتشار/اشتراک، پیامرسانی موضوع FCM به شما امکان میدهد پیامی را به چندین دستگاهی که موضوع خاصی را انتخاب کردهاند ارسال کنید. شما پیامهای موضوعی را در صورت نیاز مینویسید، و FCM مسیریابی و تحویل پیام را بهطور قابل اعتماد به دستگاههای مناسب انجام میدهد.
برای مثال، کاربران یک برنامه محلی پیشبینی جزر و مد میتوانند موضوع «هشدار جریانهای جزر و مد» را انتخاب کنند و اعلانهای شرایط بهینه ماهیگیری در آبهای شور را در مناطق مشخص دریافت کنند. کاربران یک برنامه ورزشی می توانند مشترک به روزرسانی های خودکار در نمرات بازی های زنده برای تیم های مورد علاقه خود شوند.
نکاتی که باید در مورد موضوعات در نظر داشت:
- پیامهای موضوعی برای محتوایی مانند آبوهوا یا سایر اطلاعات در دسترس عموم مناسبتر است.
- پیامهای موضوعی بهجای تأخیر بهینهسازی شدهاند . برای تحویل سریع و ایمن به تک دستگاهها یا گروههای کوچکی از دستگاهها، پیامها را به نشانههای ثبتنام، نه موضوعات، هدف قرار دهید .
- اگر نیاز به ارسال پیام به چندین دستگاه برای هر کاربر دارید، پیامهای گروهی دستگاه را برای آن موارد استفاده در نظر بگیرید.
- پیامرسانی موضوع از اشتراکهای نامحدود برای هر موضوع پشتیبانی میکند. با این حال، FCM محدودیت هایی را در این زمینه ها اعمال می کند:
- یک نمونه برنامه را نمی توان در بیش از 2000 موضوع مشترک کرد.
- اگر از واردات دستهای برای اشتراک نمونههای برنامه استفاده میکنید، هر درخواست به 1000 نمونه برنامه محدود میشود.
- تعداد اشتراکهای جدید در هر پروژه با نرخ محدود است. اگر تعداد زیادی درخواست اشتراک را در مدت زمان کوتاهی ارسال کنید، سرورهای FCM با پاسخ
429 RESOURCE_EXHAUSTED
("بیش از سهمیه") پاسخ خواهند داد. با عقب نشینی نمایی دوباره امتحان کنید.
برنامه مشتری را در یک موضوع مشترک کنید
برنامه های مشتری می توانند در هر موضوع موجود مشترک شوند یا می توانند موضوع جدیدی ایجاد کنند. هنگامی که یک برنامه مشتری در نام موضوع جدیدی مشترک می شود (نامی که قبلاً برای پروژه Firebase شما وجود ندارد)، موضوع جدیدی با آن نام در FCM ایجاد می شود و هر مشتری می تواند متعاقباً در آن مشترک شود.
برای اشتراک در یک موضوع، برنامه مشتری Firebase Cloud Messaging subscribeToTopic()
با نام موضوع FCM فرا میخواند. این روش یک Task
را برمیگرداند که میتواند توسط شنونده تکمیل برای تعیین اینکه آیا اشتراک موفق بوده است یا خیر استفاده کند:
Kotlin
Firebase.messaging.subscribeToTopic("weather") .addOnCompleteListener { task -> var msg = "Subscribed" if (!task.isSuccessful) { msg = "Subscribe failed" } Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() }
Java
FirebaseMessaging.getInstance().subscribeToTopic("weather") .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { String msg = "Subscribed"; if (!task.isSuccessful()) { msg = "Subscribe failed"; } Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
برای لغو اشتراک، برنامه مشتری Firebase Cloud Messaging با نام موضوع unsubscribeFromTopic()
فرا می خواند.
اشتراک های موضوع را در سرور مدیریت کنید
Firebase Admin 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");
Admin FCM API همچنین به شما این امکان را می دهد که اشتراک دستگاه ها را از یک موضوع با ارسال نشانه های ثبت نام به روش مناسب لغو کنید:
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 می شود. نوع بازگشت بدون در نظر گرفتن تعداد نشانه های ثبت نام مشخص شده در درخواست، قالب یکسانی دارد.
در صورت بروز خطا (مشکلات احراز هویت، نشانه یا موضوع نامعتبر و غیره) این روش ها منجر به خطا می شوند. برای فهرست کامل کدهای خطا، از جمله توضیحات و مراحل حل، به Admin FCM API Errors مراجعه کنید.
دریافت و مدیریت پیام های موضوعی
FCM پیام های موضوعی را به همان روشی که سایر پیام های پایین دستی ارائه می دهد.
برای دریافت پیام، از سرویسی استفاده کنید که FirebaseMessagingService
گسترش دهد. سرویس شما باید تماسهای onMessageReceived
و onDeletedMessages
را لغو کند.
onMessageReceived
برای اکثر انواع پیام، با استثنائات زیر ارائه شده است:
پیامهای اعلان زمانی که برنامه شما در پسزمینه است ارسال میشود . در این حالت اعلان به سینی سیستم دستگاه تحویل داده می شود. ضربه زدن کاربر روی یک اعلان، راهانداز برنامه را بهطور پیشفرض باز میکند.
پیامهایی با اعلان و بار داده، وقتی در پسزمینه دریافت میشوند . در این حالت، اعلان به سینی سیستم دستگاه تحویل داده میشود و محموله دادهها در موارد اضافی هدف فعالیت راهانداز شما تحویل داده میشود.
به طور خلاصه:
وضعیت برنامه | اطلاع رسانی | داده ها | هر دو |
---|---|---|---|
پیش زمینه | onMessageReceived | onMessageReceived | onMessageReceived |
پس زمینه | سینی سیستم | onMessageReceived | اعلان: سینی سیستم داده: در موارد اضافی قصد. |
پاسخ تماس onMessageReceived
دارای وقفه هایی است که به شما امکان می دهد به سادگی یک اعلان ارسال کنید، اما تایمرها طوری طراحی نشده اند که به برنامه اجازه دسترسی به شبکه یا انجام کارهای اضافی را بدهد. به این ترتیب، اگر برنامه شما کار پیچیده تری انجام می دهد، باید کارهای بیشتری انجام دهید تا مطمئن شوید که برنامه می تواند کار خود را کامل کند.
اگر انتظار دارید برنامه شما نزدیک به 10 ثانیه برای مدیریت یک پیام نیاز داشته باشد، باید یک کار WorkManager را برنامه ریزی کنید یا دستورالعمل WakeLock زیر را دنبال کنید. در برخی موارد، بسته به تأخیرهای پیش از تماس onMessageReceived
، از جمله تأخیرهای سیستم عامل، زمان راهاندازی برنامه، مسدود شدن رشته اصلی توسط عملیاتهای دیگر، یا تماسهای قبلی onMessageReceived
که بیش از حد طولانی میشوند، پنجره زمانی برای مدیریت پیام ممکن است کمتر از 10 ثانیه باشد. پس از انقضای آن تایمر، برنامه شما ممکن است در معرض محدودیتهای کشتن فرآیند یا اجرای پسزمینه باشد. به خاطر داشته باشید که تاخیر برای تراکنشهای شبکه و راهاندازی برنامهها میتواند قابل توجه باشد، بنابراین در صورت شک، برنامهریزی کنید که پردازش پیامتان طولانی شود، اگر وابستگیهای ناهمزمانی مانند دسترسی به شبکه یا الزامات بارگیری شدید داده وجود دارد.
مانیفست برنامه را ویرایش کنید
برای استفاده از FirebaseMessagingService
، باید موارد زیر را در مانیفست برنامه خود اضافه کنید:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
همچنین، توصیه می شود مقادیر پیش فرض را برای سفارشی کردن ظاهر اعلان ها تنظیم کنید. میتوانید یک نماد پیشفرض سفارشی و یک رنگ پیشفرض سفارشی را مشخص کنید که هر زمان که مقادیر معادل در محموله اعلان تنظیم نشده باشند، اعمال شوند.
برای تنظیم نماد پیشفرض و رنگ سفارشی، این خطوط را داخل تگ application
اضافه کنید:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
اندروید نماد پیشفرض سفارشی را نمایش میدهد
- همه پیامهای اعلان ارسال شده از سازنده اعلانها .
- هر پیام اعلانی که به صراحت نماد را در محموله اعلان تنظیم نکرده باشد.
اندروید از رنگ پیش فرض سفارشی برای
- همه پیامهای اعلان ارسال شده از سازنده اعلانها .
- هر پیام اعلانی که به صراحت رنگ را در محموله اعلان تنظیم نکرده باشد.
اگر هیچ نماد پیشفرض سفارشی تنظیم نشده باشد و هیچ نمادی در بار اعلان تنظیم نشده باشد، Android نماد برنامه را به رنگ سفید نمایش میدهد.
لغو روی onMessageReceived
با نادیده گرفتن روش FirebaseMessagingService.onMessageReceived
، می توانید اقداماتی را بر اساس شی RemoteMessage دریافتی انجام دهید و داده پیام را دریافت کنید:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
هنگام مدیریت پیام های FCM، دستگاه را بیدار نگه دارید
اگر برنامه شما باید هنگام پردازش یک پیام FCM دستگاه را بیدار نگه دارد، در این زمان باید WakeLock را نگه دارد یا باید یک کار WorkManager ایجاد کند. WakeLocks برای فعالیتهای پردازش کوتاهی که ممکن است از مهلت زمانی پیشفرض onMessageReceived
فراتر رود، به خوبی کار میکند. برای گردشهای کاری گسترده، مانند ارسال چندین RPC سریال به سرورهای شما، استفاده از کار WorkManager مناسبتر از WakeLock است. در این بخش بر روی نحوه استفاده از WakeLocks تمرکز می کنیم. WakeLock از خوابیدن دستگاه در حین اجرای برنامه جلوگیری میکند، که میتواند منجر به افزایش مصرف باتری شود، بنابراین استفاده از WakeLocks باید برای مواردی که برنامه شما نباید در هنگام مدیریت پیام متوقف شود، رزرو شود، مانند:
- اعلان هایی به کاربر که به زمان حساس هستند.
- فعل و انفعالات با یک دستگاه خاموش که نباید قطع شود (مانند انتقال شبکه یا ارتباطات با دستگاه دیگر، مانند ساعت جفت شده).
ابتدا باید مطمئن شوید که برنامه شما مجوز WakeLock را درخواست میکند (FCM SDK به طور پیشفرض این مورد را شامل میشود، بنابراین معمولاً نیازی به اضافه کردن چیزی نیست).
<uses-permission android:name="android.permission.WAKE_LOCK" />
سپس برنامه شما باید در ابتدای فراخوانی FirebaseMessagingService.onMessageReceived()
یک WakeLock دریافت کند و در پایان تماس آن را آزاد کند.
FirebaseMessagingService
سفارشی برنامه:
@Override public void onMessageReceived(final RemoteMessage message) { // If this is a message that is time sensitive or shouldn't be interrupted WakeLock wakeLock = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK, "myApp:messageReceived"); try { wakeLock.acquire(TIMEOUT_MS); // handle message ... finally { wakeLock.release(); } }
لغو onDeletedMessages
در برخی شرایط، FCM ممکن است پیامی را ارائه نکند. این زمانی اتفاق میافتد که پیامهای زیادی (بیش از 100) برای برنامه شما در زمان اتصال دستگاه خاص در انتظار آن باشد یا اگر دستگاه بیش از یک ماه است که به FCM متصل نشده باشد. در این موارد، ممکن است یک پاسخ به FirebaseMessagingService.onDeletedMessages()
دریافت کنید، زمانی که نمونه برنامه این پاسخ تماس را دریافت می کند، باید یک همگام سازی کامل با سرور برنامه شما انجام دهد. اگر در 4 هفته گذشته پیامی برای برنامه در آن دستگاه ارسال نکرده باشید، FCM با onDeletedMessages()
تماس نخواهد گرفت.پیامهای اعلان را در یک برنامه پسزمینه مدیریت کنید
وقتی برنامه شما در پسزمینه است، Android پیامهای اعلان را به سینی سیستم هدایت میکند. با ضربه زدن کاربر روی اعلان، راهانداز برنامه بهطور پیشفرض باز میشود.
این شامل پیامهایی میشود که هم شامل اعلان و هم بار داده (و همه پیامهای ارسال شده از کنسول اعلانها) هستند. در این موارد، اعلان به سینی سیستم دستگاه تحویل داده میشود و محموله دادهها بر اساس هدف فعالیت راهانداز شما تحویل داده میشود.
برای اطلاعات بیشتر در مورد تحویل پیام به برنامه خود، به داشبورد گزارش FCM مراجعه کنید، که تعداد پیامهای ارسال شده و باز شده در دستگاههای Apple و Android را به همراه دادههای «impressions» (اعلانهایی که کاربران مشاهده میکنند) را برای برنامههای Android ثبت میکند.
ساخت درخواست های ارسال
پس از ایجاد یک موضوع، یا با اشتراک نمونههای برنامه مشتری در موضوع سمت سرویس گیرنده یا از طریق 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
مراحل بعدی
- درباره روش دیگر ارسال به چندین دستگاه - پیامرسانی گروهی دستگاه بیشتر بدانید