Mengirim pesan ke topik di iOS

Berdasarkan model publikasi/langganan, messaging topik FCM dapat digunakan untuk mengirim pesan ke beberapa perangkat yang mengikuti topik tertentu. Anda menulis pesan topik sesuai kebutuhan, dan FMC akan menangani perutean serta mengirimkan pesan dengan baik ke perangkat yang tepat.

Misalnya, pengguna aplikasi perkiraan pasang laut lokal dapat memilih untuk menerima topik "pemberitahuan arus pasang surut" dan menerima notifikasi tentang kondisi penangkapan ikan air asin yang optimal di area tertentu. Pengguna aplikasi olahraga dapat berlangganan informasi skor pertandingan langsung secara otomatis untuk tim favoritnya.

Beberapa hal yang perlu diingat tentang topik:

  • Messaging topik sangat cocok untuk konten seperti cuaca, atau informasi lainnya yang tersedia untuk umum.
  • Pesan topik dioptimalkan untuk throughput, bukan latensi. Untuk pengiriman yang cepat dan aman ke satu perangkat atau sekelompok kecil perangkat, targetkan pesan ke token pendaftaran, bukan topik.
  • Jika Anda perlu mengirim pesan ke beberapa perangkat per pengguna, sebaiknya gunakan messaging grup perangkat untuk kasus penggunaan tersebut.
  • Pengiriman pesan topik mendukung langganan tak terbatas untuk setiap topik. Namun, FCM memberlakukan batasan pada area berikut ini:
    • Satu instance aplikasi hanya dapat berlangganan maksimal 2.000 topik.
    • Jika Anda menggunakan impor batch untuk berlangganan instance aplikasi, setiap permintaan dibatasi ke 1.000 instance aplikasi.
    • Frekuensi langganan baru dibatasi kapasitasnya per project. Jika Anda mengirim terlalu banyak permintaan berlangganan dalam waktu singkat, server FCM akan merespons dengan respons 429 RESOURCE_EXHAUSTED ("kuota terlampaui"). Coba lagi dengan backoff eksponensial.

Membuat aplikasi klien berlangganan topik

Aplikasi klien dapat berlangganan ke topik yang ada atau membuat topik baru. Jika aplikasi klien berlangganan nama topik baru (yang belum ada untuk project Firebase Anda), topik baru untuk nama tersebut dibuat di FCM dan setelahnya klien dapat berlangganan.

Untuk berlangganan topik, panggil metode langganan dari thread utama aplikasi Anda (FCM tidak aman untuk thread). Jika awalnya permintaan langganan gagal, FCM akan mencoba kembali secara otomatis. Untuk beberapa kasus dengan langganan yang tidak dapat diselesaikan, langganan menghasilkan error yang dapat Anda tangkap di pengendali penyelesaian seperti yang ditunjukkan berikut:

Swift

Messaging.messaging().subscribe(toTopic: "weather") { error in
  print("Subscribed to weather topic")
}

Objective-C

[[FIRMessaging messaging] subscribeToTopic:@"weather"
                                completion:^(NSError * _Nullable error) {
  NSLog(@"Subscribed to weather topic");
}];

Panggilan ini membuat permintaan asinkron ke backend FCM dan membuat klien berlangganan ke topik tertentu. Sebelum memanggil subscribeToTopic:topic, pastikan bahwa instance aplikasi klien telah menerima token pendaftaran melalui callback didReceiveRegistrationToken.

Setiap kali aplikasi dijalankan, FCM memastikan bahwa aplikasi tersebut telah berlangganan ke semua topik yang diminta. Untuk berhenti berlangganan, panggil unsubscribeFromTopic:topic, dan FCM akan berhenti berlangganan ke topik yang ada di background.

Mengelola langganan topik di server

Anda dapat memanfaatkan API ID Instance untuk melakukan tugas pengelolaan topik dasar dari sisi server. Dengan token pendaftaran yang ada dari instance aplikasi klien, Anda dapat melakukan hal-hal berikut:

Menerima dan menangani pesan topik

FCM mengantarkan pesan topik dengan cara yang sama seperti pesan downstream lainnya.

Terapkan AppDelegate application:didReceiveRemoteNotification: seperti berikut:

Swift

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Membuat permintaan kirim

Mengirim pesan ke topik Firebase Cloud Messaging serupa dengan mengirim pesan ke perangkat individual atau ke grup pengguna. Server aplikasi menetapkan kunci topic dalam isi pesan dengan nilai seperti yourTopic. Developer bisa memilih nama topik apa pun yang cocok dengan ekspresi reguler: "[a-zA-Z0-9-_.~%]+".

Untuk mengirim ke kombinasi beberapa topik, server aplikasi menetapkan kunci condition ke kondisi boolean yang menentukan topik target. Misalnya, untuk mengirimkan pesan ke perangkat yang berlangganan TopicA dan salah satu dari TopicB atau TopicC:

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

FCM mengevaluasi terlebih dahulu setiap kondisi di dalam tanda kurung, lalu mengevaluasi ekspresi tersebut dari kiri ke kanan. Pada ekspresi di atas, pengguna yang berlangganan satu topik apa pun tidak akan menerima pesan. Demikian pula, pengguna yang tidak berlangganan TopicA tidak akan menerima pesan. Namun, kombinasi berikut akan menerima pesan:

  • TopicA dan TopicB
  • TopicA dan TopicC

Anda dapat menyertakan hingga lima topik dalam ekspresi bersyarat. Penggunaan tanda kurung didukung. Operator yang didukung: &&, ||, !. Perhatikan penggunaan untuk !:

!('TopicA' in topics)

Dengan menggunakan ekspresi ini, setiap instance aplikasi yang tidak berlangganan TopicA, termasuk instance aplikasi yang tidak berlangganan topik mana pun, akan menerima pesan.

Untuk mengetahui detail lebih lanjut tentang kunci server aplikasi, lihat informasi referensi.

Permintaan HTTP POST topik

Mengirim ke sebuah topik:

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

Mengirim dengan 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

Mengirim ke perangkat yang berlangganan topik "dogs" atau "cats":

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

Mengirim dengan 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

Respons HTTP topik

{
    "name": "projects/myproject-b5ae1/messages/5735743068807585451"
}

Untuk mengetahui daftar lengkap opsi pesan, lihat referensi HTTP v1 API.

Langkah berikutnya

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.