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

برای ارسال یک پیام به چندین دستگاه، از پیام‌رسانی موضوعی استفاده کنید. این ویژگی به شما امکان می‌دهد پیامی را به چندین دستگاه که در یک موضوع خاص شرکت کرده‌اند، ارسال کنید.

این آموزش بر ارسال پیام‌های موضوعی از سرور برنامه شما با استفاده از Admin SDK یا REST API برای FCM و دریافت و مدیریت آنها در یک برنامه اندرویدی تمرکز دارد. ما مدیریت پیام‌ها را برای برنامه‌های پس‌زمینه و پیش‌زمینه پوشش خواهیم داد. تمام مراحل دستیابی به این هدف، از راه‌اندازی تا تأیید، پوشش داده شده است.

SDK را تنظیم کنید

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

قبل از اینکه شروع کنی

  • اندروید استودیو را به آخرین نسخه نصب یا به‌روزرسانی کنید.

  • مطمئن شوید که پروژه شما این الزامات را برآورده می‌کند (توجه داشته باشید که برخی از محصولات ممکن است الزامات سختگیرانه‌تری داشته باشند):

    • هدف API سطح ۲۱ (لالی‌پاپ) یا بالاتر
    • از اندروید ۵.۰ یا بالاتر استفاده می‌کند
    • از Jetpack (AndroidX) استفاده می‌کند که شامل برآورده کردن این الزامات نسخه می‌شود:
      • com.android.tools.build:gradle نسخه ۷.۳.۰ یا بالاتر
      • compileSdkVersion ۲۸ یا بالاتر
  • یک دستگاه فیزیکی راه‌اندازی کنید یا از یک شبیه‌ساز برای اجرای برنامه خود استفاده کنید.
    توجه داشته باشید که SDK های فایربیس که به سرویس‌های گوگل پلی وابسته هستند، نیاز دارند که دستگاه یا شبیه‌ساز، سرویس‌های گوگل پلی را نصب کرده باشد.

  • با استفاده از حساب گوگل خود وارد فایربیس شوید .

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

ایجاد یک پروژه فایربیس

قبل از اینکه بتوانید Firebase را به برنامه اندروید خود اضافه کنید، باید یک پروژه Firebase ایجاد کنید تا به برنامه اندروید شما متصل شود. برای کسب اطلاعات بیشتر در مورد پروژه‌های Firebase، به بخش «درک پروژه‌های Firebase» مراجعه کنید.

برنامه خود را با Firebase ثبت کنید

برای استفاده از فایربیس در برنامه اندروید خود، باید برنامه خود را در پروژه فایربیس خود ثبت کنید. ثبت برنامه اغلب "افزودن" برنامه به پروژه شما نامیده می‌شود.

  1. به کنسول Firebase بروید.

  2. در مرکز صفحه نمای کلی پروژه، روی آیکون اندروید ( ) یا افزودن برنامه کلیک کنید تا گردش کار راه‌اندازی شود.

  3. نام بسته برنامه خود را در فیلد نام بسته اندروید وارد کنید.

  4. (اختیاری) یک نام مستعار برنامه وارد کنید، که یک شناسه داخلی و راحت است که فقط در کنسول Firebase برای شما قابل مشاهده است.

  5. روی ثبت برنامه کلیک کنید.

یک فایل پیکربندی Firebase اضافه کنید

  1. فایل پیکربندی فایربیس برنامه خود ( google-services.json ) را دانلود و سپس به کدبیس خود اضافه کنید:

    1. برای دریافت فایل پیکربندی Firebase برنامه خود، روی «دانلود google-services.json» کلیک کنید.

    2. فایل پیکربندی خود را به دایرکتوری ریشه ماژول (سطح برنامه) برنامه خود منتقل کنید.

  2. برای اینکه مقادیر موجود در فایل پیکربندی google-services.json شما برای SDK های Firebase قابل دسترسی باشند، به افزونه Gradle مربوط به سرویس‌های گوگل ( google-services ) نیاز دارید.

    1. در فایل Gradle سطح ریشه (سطح پروژه) خود ( <project>/build.gradle.kts یا <project>/build.gradle )، افزونه سرویس‌های گوگل را به عنوان یک وابستگی اضافه کنید:

      Kotlin

      plugins {
        id("com.android.application") version "7.3.0" apply false
        // ...
      
        // Add the dependency for the Google services Gradle plugin
        id("com.google.gms.google-services") version "4.4.4" apply false
      }

      Groovy

      plugins {
        id 'com.android.application' version '7.3.0' apply false
        // ...
      
        // Add the dependency for the Google services Gradle plugin
        id 'com.google.gms.google-services' version '4.4.4' apply false
      }
    2. در فایل Gradle ماژول (سطح برنامه) خود (معمولاً <project>/<app-module>/build.gradle.kts یا <project>/<app-module>/build.gradle )، افزونه سرویس‌های گوگل را اضافه کنید:

      Kotlin

      plugins {
        id("com.android.application")
      
        // Add the Google services Gradle plugin
        id("com.google.gms.google-services")
        // ...
      }

      Groovy

      plugins {
        id 'com.android.application'
      
        // Add the Google services Gradle plugin
        id 'com.google.gms.google-services'
        // ...
      }

اضافه کردن کیت‌های توسعه نرم‌افزار فایربیس به برنامه‌تان

  1. در فایل Gradle ماژول (سطح برنامه) خود (معمولاً <project>/<app-module>/build.gradle.kts یا <project>/<app-module>/build.gradle )، وابستگی مربوط به کتابخانه Firebase Cloud Messaging برای اندروید را اضافه کنید. توصیه می‌کنیم از Firebase Android BoM برای کنترل نسخه‌بندی کتابخانه استفاده کنید.

    برای یک تجربه بهینه با Firebase Cloud Messaging ، توصیه می‌کنیم Google Analytics در پروژه Firebase خود فعال کنید و Firebase SDK را برای Google Analytics به برنامه خود اضافه کنید.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.4.0"))
    
        // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-messaging")
        implementation("com.google.firebase:firebase-analytics")
    }

    با استفاده از Firebase Android BoM ، برنامه شما همیشه از نسخه‌های سازگار کتابخانه‌های اندروید Firebase استفاده خواهد کرد.

    (جایگزین) اضافه کردن وابستگی‌های کتابخانه Firebase بدون استفاده از BoM

    اگر تصمیم به استفاده از Firebase BoM ندارید، باید هر نسخه از کتابخانه Firebase را در خط وابستگی آن مشخص کنید.

    توجه داشته باشید که اگر از چندین کتابخانه Firebase در برنامه خود استفاده می‌کنید، اکیداً توصیه می‌کنیم از BoM برای مدیریت نسخه‌های کتابخانه استفاده کنید، که تضمین می‌کند همه نسخه‌ها سازگار هستند.

    dependencies {
        // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-messaging:25.0.1")
        implementation("com.google.firebase:firebase-analytics:23.0.0")
    }

  2. پروژه اندروید خود را با فایل‌های Gradle همگام‌سازی کنید.

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

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

برای اشتراک در یک موضوع، برنامه کلاینت، subscribeToTopic() نوع Firebase Cloud Messaging را با نام موضوع 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();
            }
        });

برای لغو اشتراک، برنامه‌ی کلاینت، تابع unsubscribeFromTopic() Firebase Cloud Messaging را به همراه نام موضوع فراخوانی می‌کند.

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

FCM پیام‌های موضوعی را مانند سایر پیام‌های پایین‌دستی ارسال می‌کند.

برای دریافت پیام‌ها، از سرویسی استفاده کنید که FirebaseMessagingService ارث‌بری می‌کند. سرویس شما باید فراخوانی‌های onMessageReceived و onDeletedMessages را لغو کند.

onMessageReceived برای اکثر انواع پیام‌ها ارائه می‌شود، به جز موارد استثنای زیر:

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

  • پیام‌هایی که هم حاوی اعلان و هم حاوی داده هستند، وقتی در پس‌زمینه دریافت می‌شوند . در این حالت، اعلان به سینی سیستم دستگاه ارسال می‌شود و داده در بخش‌های اضافیِ intent مربوط به اکتیویتیِ لانچر شما ارسال می‌شود.

به طور خلاصه:

حالت برنامه اعلان داده‌ها هر دو
پیش‌زمینه 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" />

اندروید آیکون پیش‌فرض سفارشی را برای

  • تمام پیام‌های اعلان ارسال شده از آهنگساز Notifications .
  • هر پیام اعلانی که به صراحت آیکون را در بار داده اعلان تنظیم نکند.

اندروید از رنگ پیش‌فرض سفارشی برای

  • تمام پیام‌های اعلان ارسال شده از آهنگساز Notifications .
  • هر پیام اعلانی که صراحتاً رنگ را در بار داده اعلان تنظیم نکند.

اگر هیچ آیکون پیش‌فرض سفارشی تنظیم نشده باشد و هیچ آیکونی در فایل اعلان تنظیم نشده باشد، اندروید آیکون برنامه را به رنگ سفید نمایش می‌دهد.

نادیده گرفتن onMessageReceived

با بازنویسی (override) متد 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 job ایجاد کند. WakeLocks برای فعالیت‌های پردازشی کوتاه که ممکن است از زمان‌های پیش‌فرض onMessageReceived فراتر روند، به خوبی کار می‌کنند. برای گردش‌های کاری طولانی، مانند ارسال چندین RPC سریال به سرورهای شما، استفاده از WorkManager job مناسب‌تر از 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() را فراخوانی نمی‌کند.

مدیریت پیام‌های اعلان در یک برنامه در پس‌زمینه

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

این شامل پیام‌هایی می‌شود که حاوی اعلان و داده هستند (و تمام پیام‌های ارسالی از کنسول اعلان‌ها). در این موارد، اعلان به سینی سیستم دستگاه تحویل داده می‌شود و داده در بخش‌های اضافیِ intent مربوط به اکتیویتیِ لانچر شما تحویل داده می‌شود.

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

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

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

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

نود جی اس

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

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

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

نود جی اس

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

مراحل بعدی