المراسلة بشأن المواضيع على Android

استنادًا إلى نموذج النشر/الاشتراك، تتيح لك FCM المراسلة حسب المواضيع إرسال رسالة إلى أجهزة متعددة فعّلت موضوعًا معيّنًا. يمكنك إنشاء رسائل المواضيع كما هو مطلوب، ويتولى FCM توجيه الرسائل وتسليمها بشكل موثوق إلى الأجهزة المناسبة.

على سبيل المثال، يمكن لمستخدمي تطبيق توقّعات المدّ والجزر المحلي تفعيل موضوع "تنبيهات تيارات المدّ والجزر" وتلقّي إشعارات بشأن الظروف المثلى لصيد الأسماك في المياه المالحة في مناطق محدّدة. ويمكن لمستخدمي تطبيق رياضي الاشتراك في التحديثات التلقائية لنتائج المباريات المباشرة لفِرقهم المفضّلة.

في ما يلي بعض النقاط التي يجب أخذها في الاعتبار بشأن المواضيع:

  • تكون ميزة "الرسائل حول الموضوع" مناسبة بشكلٍ أفضل للمحتوى المتعلّق بالطقس أو أي معلومات أخرى متاحة للجميع.
  • يتم تحسين رسائل المواضيع لزيادة معدل نقل البيانات بدلاً من تقليل وقت الاستجابة. للتسليم السريع والآمن إلى الأجهزة الفردية أو المجموعات الصغيرة من الأجهزة، استهدِف الرسائل بعلامات تسجيل، وليس المواضيع.
  • إذا كنت بحاجة إلى إرسال رسائل إلى أجهزة متعددة لكل مستخدم، ننصحك باستخدام المراسلة الجماعية على الأجهزة في حالات الاستخدام هذه.
  • تتيح ميزة "رسائل المواضيع" اشتراكات غير محدودة لكل موضوع. ومع ذلك، تفرض FCM حدودًا في هذه المجالات:
    • لا يمكن اشتراك نسخة واحدة من التطبيق في أكثر من 2000 موضوع.
    • إذا كنت تستخدم الاستيراد المجمّع لاشتراك نُسخ التطبيق، يقتصر كل طلب على 1000 نسخة من التطبيق.
    • يكون تكرار الاشتراكات الجديدة محدودًا لمعدل كل مشروع. إذا أرسلت عددًا كبيرًا جدًا من طلبات الاشتراك في فترة زمنية قصيرة، ستستجيب خوادم FCM باستخدام ردّ 429 RESOURCE_EXHAUSTED ("تم تجاوز الحصة"). يعيد المحاولة باستخدام خوارزمية الرقود الأسي.

إشراك تطبيق العميل في موضوع

يمكن للتطبيقات التابعة للعملاء الاشتراك في أي موضوع حالي، أو يمكنها إنشاء موضوع جديد. عندما يشترك تطبيق العميل في اسم موضوع جديد (موضوع لم يكن متوفّرًا في مشروعك على Firebase)، يتم إنشاء موضوع جديد يحمل هذا الاسم في FCM ويمكن لأي عميل الاشتراك فيه لاحقًا.

للاشتراك في موضوع، يُطلِق تطبيق العميل Firebase Cloud Messaging subscribeToTopic() مع اسم الموضوع FCM. تُعرِض هذه الطريقةTask، ويمكن أن يستخدِمها مستمع الإكمال لتحديد ما إذا كان الاشتراك قد تم بنجاح:

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

لإلغاء الاشتراك، يُطلِق تطبيق العميل Firebase Cloud Messaging unsubscribeFromTopic() مع اسم الموضوع.

إدارة اشتراكات المواضيع على الخادم

يتيح لك Firebase Admin SDK تنفيذ المهام الأساسية لإدارة المواضيع من جهة الخادم. استنادًا إلى رموزها المميّزة لتسجيلها، يمكنك الاشتراك في نُسخ تطبيق العميل وإلغاء الاشتراك فيها بشكل مجمّع باستخدام منطق الخادم.

يمكنك اشتراك نُسخ تطبيق العميل في أي موضوع حالي، أو يمكنك إنشاء موضوع جديد. عند استخدام واجهة برمجة التطبيقات لإشتراك تطبيق العميل في موضوع جديد (موضوع غير متوفّر حاليًا لمشروعك على Firebase)، يتم إنشاء موضوع جديد بهذا الاسم في خدمة "مراسلة Firebase" ويمكن لأي عميل إشتراكه بعد ذلك.

يمكنك تمرير قائمة بعلامات تسجيل إلى 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");

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

انتقال

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

تتيح لك واجهة برمجة التطبيقات 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");

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

انتقال

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