Gửi tin nhắn đến nhiều thiết bị

Để nhắm mục tiêu một tin nhắn đến nhiều thiết bị, hãy sử dụng Thông điệp theo chủ đề. Chiến dịch này cho phép bạn gửi tin nhắn đến nhiều thiết bị đã chọn tham gia một chủ đề cụ thể.

Hướng dẫn này tập trung vào việc gửi thông báo theo chủ đề từ máy chủ ứng dụng bằng cách sử dụng SDK quản trị hoặc API REST cho FCM, cũng như tiếp nhận và xử lý chúng trong ứng dụng Android. Chúng tôi sẽ đề cập đến cách xử lý thông báo cho cả quảng cáo chạy ở chế độ nền và các ứng dụng chạy trên nền trước. Tất cả các bước để đạt được điều này đều được đề cập, từ thiết lập cho đến xác minh.

Thiết lập SDK

Phần này có thể bao gồm các bước mà bạn đã hoàn tất nếu bạn đã thiết lập một ứng dụng Android cho FCM hoặc đã làm theo các bước để Gửi tin nhắn đầu tiên của bạn.

Trước khi bắt đầu

  • Cài đặt hoặc cập nhật Android Studio lên phiên bản mới nhất.

  • Đảm bảo rằng dự án của bạn đáp ứng các yêu cầu này (lưu ý rằng một số sản phẩm có thể có yêu cầu nghiêm ngặt hơn):

    • Nhắm mục tiêu API cấp 19 (KitKat) hoặc cao hơn
    • Sử dụng Android 4.4 trở lên
    • Công dụng Jetpack (AndroidX), bao gồm việc đáp ứng các yêu cầu sau đây về phiên bản:
      • com.android.tools.build:gradle phiên bản 7.3.0 trở lên
      • compileSdkVersion 28 trở lên
  • Thiết lập một thiết bị thực hoặc sử dụng trình mô phỏng sang chạy ứng dụng của bạn.
    Lưu ý rằng Firebase SDK có phần phụ thuộc trên Google Play các dịch vụ yêu cầu thiết bị hoặc trình mô phỏng cài đặt Dịch vụ Google Play.

  • Đăng nhập vào Firebase bằng tài khoản Google tài khoản.

Nếu bạn chưa có dự án Android và chỉ muốn dùng thử Firebase sản phẩm, bạn có thể tải xuống một trong các mẫu bắt đầu nhanh của chúng tôi.

Tạo một dự án Firebase

Trước khi có thể thêm Firebase vào ứng dụng Android, bạn cần tạo một Firebase dự án để kết nối với ứng dụng Android của bạn. Truy cập/ghé qua Tìm hiểu về các dự án Firebase để tìm hiểu thêm Dự án Firebase.

Đăng ký ứng dụng của bạn với Firebase

Để sử dụng Firebase trong ứng dụng Android, bạn cần đăng ký ứng dụng của mình với Dự án Firebase. Việc đăng ký ứng dụng của bạn thường được gọi là "thêm" ứng dụng của bạn đến dự án.

  1. Truy cập vào bảng điều khiển của Firebase.

  2. Ở giữa trang tổng quan về dự án, hãy nhấp vào biểu tượng Android () hoặc Thêm ứng dụng để khởi chạy quy trình thiết lập.

  3. Nhập tên gói của ứng dụng vào trường Android package name (Tên gói Android).

  4. (Không bắt buộc) Nhập thông tin khác về ứng dụng: Biệt hiệu của ứng dụngChứng chỉ ký gỡ lỗi SHA-1.

  5. Nhấp vào Đăng ký ứng dụng.

Thêm tệp cấu hình Firebase

  1. Tải xuống rồi thêm tệp cấu hình Android của Firebase (google-services.json) cho ứng dụng của bạn:

    1. Nhấp vào Download google-services.json xuống để tải Firebase Android config của bạn.

    2. Di chuyển tệp cấu hình của bạn vào thư mục gốc mô-đun (cấp ứng dụng) của ứng dụng của bạn.

  2. Để làm cho các giá trị trong tệp cấu hình google-services.json có thể truy cập được vào Firebase SDK, bạn cần có Trình bổ trợ Gradle cho các dịch vụ của Google (google-services).

    1. Trong tệp Gradle cấp gốc (cấp dự án) (<project>/build.gradle.kts hoặc <project>/build.gradle), hãy thêm Trình bổ trợ các dịch vụ của Google làm phần phụ thuộc:

      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.2" 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.2' apply false
      }
      
    2. Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), thêm trình bổ trợ các dịch vụ của Google:

      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'
        // ...
      }
      

Thêm Firebase SDK vào ứng dụng của bạn

  1. Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), thêm phần phụ thuộc cho thư viện Giải pháp gửi thông báo qua đám mây của Firebase cho Android. Bạn nên sử dụng Bảng kê khai thành phần của Firebase cho Android để kiểm soát việc tạo phiên bản thư viện.

    Để có trải nghiệm tối ưu với Giải pháp gửi thông báo qua đám mây của Firebase, bạn nên bật Google Analytics trong dự án Firebase và thêm Firebase SDK cho Google Analytics vào ứng dụng của bạn.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
    
        // 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")
    }
    

    Bằng cách sử dụng Firebase Android BoM, ứng dụng của bạn sẽ luôn sử dụng các phiên bản tương thích của thư viện Android trên Firebase.

    (Phương án thay thế) Thêm các phần phụ thuộc của thư viện Firebase mà không sử dụng BoM

    Nếu chọn không sử dụng BoM của Firebase, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phụ thuộc.

    Lưu ý rằng nếu bạn sử dụng nhiều thư viện Firebase trong ứng dụng của mình, chúng tôi thực sự bạn nên sử dụng BoM để quản lý các phiên bản thư viện. Điều này đảm bảo rằng tất cả các phiên bản đều tương thích.

    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:24.0.0")
        implementation("com.google.firebase:firebase-analytics:22.0.2")
    }
    
    Bạn đang tìm một mô-đun thư viện dành riêng cho Kotlin? Bắt đầu sau Tháng 10 năm 2023 (Firebase BoM 32.5.0), cả nhà phát triển Kotlin và Java đều có thể phụ thuộc vào mô-đun thư viện chính (để biết thông tin chi tiết, hãy xem Câu hỏi thường gặp về sáng kiến này).

  2. Đồng bộ hoá dự án Android với các tệp Gradle.

Đăng ký ứng dụng khách theo một chủ đề

Ứng dụng khách có thể đăng ký theo dõi bất kỳ chủ đề hiện có nào hoặc có thể tạo một chủ đề mới chủ đề. Khi một ứng dụng khách đăng ký một tên chủ đề mới (tên này phù hợp với chưa tồn tại cho dự án Firebase của bạn), một chủ đề mới có tên đó là tạo trong FCM và mọi khách hàng sau đó đều có thể đăng ký tài khoản này.

Để đăng ký một chủ đề, ứng dụng khách này sẽ gọi Giải pháp gửi thông báo qua đám mây của Firebase subscribeToTopic() với tên chủ đề FCM. Phương thức này sẽ trả về một Task mà trình nghe hoàn thành có thể sử dụng để xác định xem đăng ký thành công:

Kotlin+KTX

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

Để huỷ đăng ký, ứng dụng khách này sẽ gọi Giải pháp gửi thông báo qua đám mây của Firebase unsubscribeFromTopic() với tên chủ đề.

Nhận và xử lý thông báo theo chủ đề

FCM gửi thông điệp theo chủ đề theo cách tương tự như những kênh hạ nguồn khác tin nhắn.

Để nhận tin nhắn, hãy sử dụng một dịch vụ mở rộng FirebaseMessagingService. Dịch vụ của bạn phải ghi đè onMessageReceivedonDeletedMessages lệnh gọi lại.

Khoảng thời gian xử lý thông báo có thể ngắn hơn 20 giây tuỳ thuộc vào sự chậm trễ phát sinh trước khi gọi onMessageReceived, bao gồm cả độ trễ hệ điều hành, thời gian khởi động ứng dụng, luồng chính đang bị chặn bởi các thao tác khác hoặc onMessageReceived trước đó cuộc gọi mất quá nhiều thời gian. Sau thời gian đó, các hành vi hệ điều hành khác nhau như quy trình giết người hoặc của Android O giới hạn thực thi trong nền có thể ảnh hưởng đến khả năng hoàn thành công việc của bạn.

onMessageReceived được cung cấp cho hầu hết các loại thông báo, với những loại sau ngoại lệ:

  • Gửi tin nhắn thông báo khi ứng dụng của bạn chạy trong nền. Trong phần này hộp đựng, thông báo sẽ được gửi đến khay hệ thống của thiết bị. Người dùng nhấn vào một thông báo mở trình chạy ứng dụng theo mặc định.

  • Tin nhắn có cả tải trọng thông báo và tải trọng dữ liệu, khi nhận ở chế độ nền. Trong trường hợp này, thông báo sẽ được gửi đến khay hệ thống của thiết bị, và tải trọng dữ liệu được phân phối trong phần bổ sung của ý định của Hoạt động của trình chạy.

Tóm lại:

Trạng thái ứng dụng Thông báo Dữ liệu Cả hai
Màu nổi onMessageReceived onMessageReceived onMessageReceived
Thông tin khái quát Khay hệ thống onMessageReceived Thông báo: khay hệ thống
Dữ liệu: trong phần bổ sung của ý định.
Để biết thêm thông tin về các loại thông báo, hãy xem Thông báo và tin nhắn dữ liệu.

Chỉnh sửa tệp kê khai ứng dụng

Để sử dụng FirebaseMessagingService, bạn cần thêm đoạn mã sau vào tệp kê khai ứng dụng:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Ngoài ra, bạn nên đặt các giá trị mặc định để tuỳ chỉnh giao diện thông báo. Bạn có thể chỉ định biểu tượng mặc định tuỳ chỉnh và màu mặc định tuỳ chỉnh được áp dụng bất cứ khi nào các giá trị tương đương không được đặt trong tải trọng thông báo.

Thêm những dòng này vào bên trong Thẻ application để đặt biểu tượng và màu sắc tuỳ chỉnh mặc định:

<!-- 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 hiển thị biểu tượng mặc định tuỳ chỉnh cho

  • Tất cả thông báo được gửi từ Trình soạn thông báo.
  • Mọi nội dung thông báo không đặt biểu tượng một cách rõ ràng trong tải trọng thông báo.

Android sử dụng màu mặc định tuỳ chỉnh cho

  • Tất cả thông báo được gửi từ Trình soạn thông báo.
  • Mọi nội dung thông báo không đặt rõ màu trong thông báo tải trọng.

Nếu bạn không đặt biểu tượng mặc định tuỳ chỉnh và biểu tượng nào trong tải trọng thông báo, Android hiển thị biểu tượng ứng dụng có màu trắng.

Ghi đè onMessageReceived

Bằng cách ghi đè phương thức FirebaseMessagingService.onMessageReceived, bạn có thể thực hiện hành động dựa trên Tin nhắn từ xa và lấy dữ liệu tin nhắn:

Kotlin+KTX

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

Ghi đè onDeletedMessages

Trong một số trường hợp, FCM có thể không gửi tin nhắn. Điều này xảy ra khi có quá nhiều thư (>100) đang chờ xử lý trong ứng dụng của bạn trên một thiết bị cụ thể tại thời điểm ứng dụng kết nối hoặc nếu thiết bị chưa kết nối với FCM trong vòng hơn một tháng. Trong những trường hợp này, bạn có thể nhận được cuộc gọi lại đến FirebaseMessagingService.onDeletedMessages() Khi thực thể ứng dụng nhận được lệnh gọi lại này, nó sẽ thực hiện đồng bộ hoá toàn bộ với máy chủ ứng dụng của bạn. Nếu bạn chưa gửi tin nhắn cho ứng dụng qua email đó thiết bị của bạn trong vòng 4 tuần qua, FCM sẽ không gọi cho onDeletedMessages().

Xử lý tin nhắn thông báo trong ứng dụng chạy ở chế độ nền

Khi ứng dụng của bạn chạy trong nền, Android sẽ chuyển tin nhắn thông báo đến khay hệ thống. Khi người dùng nhấn vào thông báo, trình chạy ứng dụng sẽ mở bằng cách mặc định.

Bao gồm cả các tin nhắn chứa cả thông báo và dữ liệu tải trọng (và tất cả thông báo được gửi từ Bảng điều khiển thông báo). Trong những trường hợp này, thông báo sẽ được gửi đến khay hệ thống và tải trọng dữ liệu được phân phối trong phần bổ sung của ý định của Hoạt động của trình chạy.

Để biết thông tin chi tiết về cách gửi thư đến ứng dụng của bạn, hãy xem Trang tổng quan báo cáo FCM, nơi ghi lại số thư được gửi và mở trên thiết bị Apple và Android, cùng với dữ liệu về "lượt hiển thị" (thông báo mà người dùng nhìn thấy) đối với ứng dụng Android.

Tạo yêu cầu gửi

Sau khi bạn tạo một chủ đề, bằng cách đăng ký các phiên bản ứng dụng khách để chủ đề ở phía máy khách hoặc thông qua server API, bạn có thể gửi thông báo đến chủ đề. Nếu đây là lần đầu tiên bạn tạo yêu cầu gửi cho FCM, hãy xem hướng dẫn về môi trường máy chủ và FCM cho thông tin quan trọng về nền tảng và chế độ thiết lập.

Trong logic gửi trên phần phụ trợ, hãy chỉ định tên chủ đề mà bạn muốn như được hiển thị:

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

Java

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

Python

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

Tiến hành

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

Kiến trúc chuyển trạng thái đại diện (REST)

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

Lệnh 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

Để gửi thư đến một tổ hợp chủ đề, chỉ định điều kiện, là biểu thức boolean chỉ định chủ đề mục tiêu. Ví dụ: điều kiện sau đây sẽ gửi thông báo đến các thiết bị đã đăng ký TopicATopicB hoặc TopicC:

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

Trước tiên, FCM đánh giá mọi điều kiện trong dấu ngoặc đơn, sau đó đánh giá biểu thức từ trái sang phải. Trong biểu thức trên, người dùng đã đăng ký bất kỳ chủ đề nào đều không nhận được thông báo. Tương tự, một người dùng không đăng ký TopicA không nhận được thông báo. Những cách kết hợp này nhận email:

  • TopicATopicB
  • TopicATopicC

Bạn có thể đưa tối đa 5 chủ đề vào biểu thức có điều kiện.

Để gửi đến một điều kiện:

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

Java

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

Python

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

Tiến hành

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

Kiến trúc chuyển trạng thái đại diện (REST)

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

Lệnh 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

Các bước tiếp theo