Check out what’s new from Firebase at Google I/O 2022. Learn more

Nhắn tin theo chủ đề trên Android

Dựa trên mô hình xuất bản / đăng ký, nhắn tin theo chủ đề FCM cho phép bạn gửi tin nhắn đến nhiều thiết bị đã chọn tham gia vào một chủ đề cụ thể. Bạn soạn tin nhắn chủ đề nếu cần và FCM xử lý việc định tuyến và gửi tin nhắn đến đúng thiết bị một cách đáng tin cậy.

Ví dụ: người dùng ứng dụng dự báo thủy triều địa phương có thể chọn tham gia chủ đề "cảnh báo dòng thủy triều" và nhận thông báo về điều kiện đánh bắt cá nước mặn tối ưu ở các khu vực cụ thể. Người dùng ứng dụng thể thao có thể đăng ký nhận các bản cập nhật tự động về tỷ số trận đấu trực tiếp cho các đội yêu thích của họ.

Một số điều cần lưu ý về các chủ đề:

  • Nhắn tin theo chủ đề phù hợp nhất với nội dung như thời tiết hoặc thông tin công khai khác.
  • Thông điệp chủ đề được tối ưu hóa cho thông lượng hơn là độ trễ . Để phân phối nhanh chóng, an toàn đến các thiết bị đơn lẻ hoặc các nhóm thiết bị nhỏ, hãy nhắm mục tiêu các thông báo đến mã thông báo đăng ký , không phải chủ đề.
  • Nếu bạn cần gửi tin nhắn đến nhiều thiết bị cho mỗi người dùng , hãy xem xét nhắn tin nhóm thiết bị cho những trường hợp sử dụng đó.
  • Nhắn tin theo chủ đề hỗ trợ đăng ký không giới hạn cho mỗi chủ đề. Tuy nhiên, FCM thực thi các giới hạn trong các lĩnh vực sau:
    • Một phiên bản ứng dụng có thể được đăng ký cho không quá 2000 chủ đề.
    • Nếu bạn đang sử dụng tính năng nhập hàng loạt để đăng ký các phiên bản ứng dụng, thì mỗi yêu cầu được giới hạn ở 1000 phiên bản ứng dụng.
    • Tần suất đăng ký mới được giới hạn theo tỷ lệ cho mỗi dự án. Nếu bạn gửi quá nhiều yêu cầu đăng ký trong một khoảng thời gian ngắn, máy chủ FCM sẽ phản hồi 429 RESOURCE_EXHAUSTED ("đã vượt quá hạn ngạch"). Thử lại với kết quả dự phòng theo cấp số nhân.

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

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

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

Java

FirebaseMessaging.getInstance().subscribeToTopic("weather")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                String msg = getString(R.string.msg_subscribed);
                if (!task.isSuccessful()) {
                    msg = getString(R.string.msg_subscribe_failed);
                }
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Kotlin+KTX

Firebase.messaging.subscribeToTopic("weather")
        .addOnCompleteListener { task ->
            var msg = getString(R.string.msg_subscribed)
            if (!task.isSuccessful) {
                msg = getString(R.string.msg_subscribe_failed)
            }
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        }

Để hủy đăng ký, ứng dụng khách gọi Firebase Cloud Messaging là unsubscribeFromTopic() với tên chủ đề.

Quản lý đăng ký chủ đề trên máy chủ

SDK quản trị Firebase cho phép bạn thực hiện các tác vụ quản lý chủ đề cơ bản từ phía máy chủ. Với (các) mã thông báo đăng ký của họ, bạn có thể đăng ký và hủy đăng ký hàng loạt các phiên bản ứng dụng khách bằng cách sử dụng logic máy chủ.

Bạn có thể đăng ký các phiên bản ứng dụng khách cho bất kỳ chủ đề hiện có nào hoặc bạn có thể tạo một chủ đề mới. Khi bạn sử dụng API để đăng ký một ứng dụng khách với một chủ đề mới (một chủ đề chưa tồn tại cho dự án Firebase của bạn), một chủ đề mới có tên đó sẽ được tạo trong FCM và bất kỳ khách hàng nào sau đó đều có thể đăng ký chủ đề đó.

Bạn có thể chuyển danh sách mã thông báo đăng ký sang phương thức đăng ký SDK dành cho quản trị viên Firebase để đăng ký các thiết bị tương ứng với một chủ đề:

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

Java

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

Python

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

Đi

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

C#

// 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 quản trị FCM cũng cho phép bạn hủy đăng ký thiết bị khỏi một chủ đề bằng cách chuyển mã thông báo đăng ký đến phương thức thích hợp:

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

Java

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

Python

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

Đi

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

C#

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

Các phương thức subscribeToTopic()unsubscribeFromTopic() dẫn đến một đối tượng chứa phản hồi từ FCM. Loại trả lại có cùng định dạng bất kể số lượng mã thông báo đăng ký được chỉ định trong yêu cầu.

Trong trường hợp xảy ra lỗi (lỗi xác thực, mã thông báo hoặc chủ đề không hợp lệ, v.v.), các phương pháp này dẫn đến lỗi. Để biết danh sách đầy đủ các mã lỗi, bao gồm mô tả và các bước giải quyết, hãy xem Lỗi API FCM dành cho quản trị viên.

Nhận và xử lý tin nhắn chủ đề

FCM gửi thông điệp chủ đề theo cách tương tự như các thông báo xuôi dòng khác.

Để nhận tin nhắn, hãy sử dụng dịch vụ mở rộng FirebaseMessagingService . Dịch vụ của bạn phải ghi đè các lệnh gọi lại onMessageReceivedonDeletedMessages . Nó sẽ xử lý bất kỳ thông báo nào trong vòng 20 giây sau khi nhận (10 giây trên Android Marshmallow). Khoảng thời gian có thể ngắn hơn tùy thuộc vào sự chậm trễ của hệ điều hành phát sinh trước khi gọi onMessageReceived . Sau thời gian đó, các hành vi khác nhau của hệ điều hành như giới hạn thực thi nền của Android O có thể ảnh hưởng đến khả năng hoàn thành công việc của bạn. Để biết thêm thông tin, hãy xem tổng quan của chúng tôi về mức độ ưu tiên của tin nhắn .

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

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

  • Tin nhắn có cả thông báo và tải dữ liệu, khi được nhận trong nền . Trong trường hợp này, thông báo đượ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 ngoài mục đích của Hoạt động trình khởi chạy của bạn.

Tóm tắt:

Trạng thái ứng dụng Thông báo Dữ liệu Cả hai
Vấn đề xung quanh onMessageReceived onMessageReceived onMessageReceived
Lý lịch 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 tin nhắn, 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 thông tin sau vào tệp kê khai ứng dụng của mình:

<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 để tùy chỉnh giao diện của thông báo. Bạn có thể chỉ định biểu tượng mặc định tùy chỉnh và màu mặc định tùy 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 các dòng này vào bên trong thẻ application để đặt biểu tượng mặc định tùy chỉnh và màu tùy chỉ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 tùy chỉnh cho

  • Tất cả các tin nhắn thông báo được gửi từ trình soạn thảo Thông báo .
  • Bất kỳ tin nhắn thông báo nà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 tùy chỉnh cho

  • Tất cả các tin nhắn thông báo được gửi từ trình soạn thảo Thông báo .
  • Bất kỳ thông báo thông báo nào không đặt màu rõ ràng trong trọng tải thông báo.

Nếu không có biểu tượng mặc định tùy chỉnh nào được đặt và không có biểu tượng nào được đặt trong tải thông báo, thì Android sẽ hiển thị biểu tượng ứng dụng được hiển thị bằng 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 các hành động dựa trên đối tượng RemoteMessage đã nhận và nhận dữ liệu thông báo:

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

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

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

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

Xử lý tin nhắn thông báo trong một ứng dụng nền

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

Điều này bao gồm các tin nhắn chứa cả tải thông báo và dữ liệu (và tất cả các tin nhắn đượ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 đượ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 ngoài mục đích của Hoạt động trình khởi chạy của bạn.

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

Ứng dụng bị hạn chế trong nền (Android P hoặc mới hơn)

FCM có thể không gửi tin nhắn đến các ứng dụng đã bị người dùng đặt vào chế độ giới hạn nền (chẳng hạn như thông qua: Cài đặt -> Ứng dụng và Thông báo -> [tên ứng dụng] -> Pin). Sau khi ứng dụng của bạn được xóa khỏi giới hạn nền, các tin nhắn mới đến ứng dụng sẽ được gửi như trước. Để ngăn thư bị mất và các tác động hạn chế nền khác, hãy đảm bảo tránh các hành vi xấu được liệt kê trong nỗ lực của Android vitals . Những hành vi này có thể dẫn đến việc thiết bị Android đề xuất với người dùng rằng ứng dụng của bạn bị hạn chế trong nền. Ứng dụng của bạn có thể kiểm tra xem nó có bị giới hạn trong nền hay không bằng cách sử dụng: isBackgroundRestricted () .

Xây dựng yêu cầu gửi

Sau khi bạn đã tạo chủ đề, bằng cách đăng ký các phiên bản ứng dụng khách cho chủ đề ở phía máy khách hoặc thông qua API máy chủ , bạn có thể gửi tin nhắn đến chủ đề. Nếu đây là lần đầu tiên bạn xây dựng 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 của bạn để biết thông tin cơ bản và thiết lập quan trọng.

Trong logic gửi của bạn trên chương trình phụ trợ, hãy chỉ định tên chủ đề mong 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)

Đi

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

NGHỈ NGƠI

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 tin nhắn đến một tổ hợp các chủ đề, hãy chỉ định một điều kiện , đó là một biểu thức boolean chỉ định các chủ đề đích. Ví dụ: điều kiện sau sẽ gửi tin nhắn đến các thiết bị đã đăng ký TopicATopicB hoặc TopicC :

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

Đầu tiên FCM đánh giá bất kỳ điều kiện nào 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 sẽ không nhận được thông báo. Tương tự như vậy, người dùng không đăng ký TopicA sẽ không nhận được thông báo. Những kết hợp này nhận được nó:

  • TopicATopicB
  • TopicATopicC

Bạn có thể bao gồm tối đa năm chủ đề trong biểu thức điều kiện của mình.

Để 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)

Đi

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

NGHỈ NGƠI

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

Bước tiếp theo