Mengirim pesan ke beberapa perangkat di iOS

Firebase Cloud Messaging menyediakan 2 cara untuk menargetkan pesan ke beberapa perangkat:

  • Messaging topik dapat digunakan untuk mengirim pesan ke beberapa perangkat yang mengikuti topik tertentu.
  • Messaging grup perangkat dapat Anda gunakan untuk mengirim 1 pesan ke beberapa instance aplikasi yang berjalan di beberapa perangkat milik sebuah grup.

Tutorial ini berfokus pada pengiriman pesan topik dari server aplikasi Anda menggunakan protokol HTTP atau XMPP untuk FCM, dan menerima serta memprosesnya dalam aplikasi iOS. Halaman ini membahas semua langkah untuk menyelesaikannya, mulai dari penyiapan hingga verifikasi. Jadi, halaman ini berisi langkah-langkah yang sudah diselesaikan jika Anda telah menyiapkan aplikasi klien iOS untuk FCM atau telah menyelesaikan langkah-langkah untuk Mengirim Pesan Pertama.

Menambahkan Firebase ke project iOS Anda

Bagian ini membahas berbagai tugas yang mungkin telah diselesaikan jika Anda telah mengaktifkan fitur Firebase lainnya untuk aplikasi. Khusus untuk FCM, Anda harus mengupload kunci autentikasi APN dan mendaftar untuk notifikasi jarak jauh.

Prasyarat

Sebelum memulai, ada beberapa hal yang perlu disiapkan di lingkungan Anda:

  • Xcode 9.4.1 atau yang lebih baru
  • Sebuah project Xcode dengan target iOS 8 atau yang lebih baru
  • Project Swift harus menggunakan Swift 3.0 atau yang lebih baru
  • ID paket dari aplikasi Anda
  • CocoaPods 1.4.0 atau yang lebih baru
  • Untuk Cloud Messaging:
    • Perangkat iOS fisik
    • Kunci Autentikasi Apple Push Notification untuk akun Developer Apple
    • Di Xcode, aktifkan Push Notifications di App > Capabilities

Jika belum memiliki project Xcode, download salah satu sampel quickstart jika Anda hanya ingin mencoba sebuah fitur Firebase. Jika Anda menggunakan quickstart, ingatlah untuk mendapatkan ID paket dari setelan project. Anda akan memerlukannya untuk langkah selanjutnya.

Menambahkan Firebase ke aplikasi

Waktunya menambahkan Firebase ke aplikasi Anda. Untuk melakukannya, Anda memerlukan project Firebase dan file konfigurasi Firebase untuk aplikasi Anda.

Untuk membuat project Firebase:

  1. Buka Firebase console.

  2. Klik Tambahkan project, lalu pilih atau masukkan Nama project.

    • Jika Anda memiliki project Google yang terkait dengan aplikasi Anda, pilih project tersebut dari menu dropdown Nama project.
    • Jika Anda belum memiliki project Google, masukkan Nama project baru.
  3. (Opsional) Edit Project ID.

    Firebase menetapkan ID unik ke project Firebase Anda secara otomatis. ID ini ditampilkan di layanan Firebase yang tersedia untuk publik, misalnya:

    • URL Realtime Database default — your-project-id.firebaseio.com
    • Nama bucket Cloud Storage default — your-project-id.appspot.com
    • Subdomain Hosting default — your-project-id.firebaseapp.com
  4. Ikuti langkah-langkah penyiapan yang tersisa di Firebase console, lalu klik Buat project (atau Tambahkan Firebase, jika Anda menggunakan project Google yang sudah ada).

Firebase menyediakan resource untuk project Firebase Anda secara otomatis. Proses ini biasanya perlu waktu beberapa menit. Setelah selesai, Anda akan dibawa ke halaman ringkasan untuk project Firebase Anda di Firebase console.

Setelah memiliki project, Anda dapat menambahkan aplikasi iOS ke dalamnya:

  1. Klik Tambahkan Firebase ke aplikasi iOS dan ikuti langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, prosesnya dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.

  2. Saat diminta, masukkan ID paket aplikasi Anda. Anda harus memasukkan ID paket yang digunakan aplikasi. Hal ini hanya dapat dilakukan saat Anda menambahkan aplikasi tersebut ke project Firebase.

  3. Tambahkan file konfigurasi iOS Firebase ke aplikasi Anda:

    1. Klik Download GoogleService-Info.plist untuk mendapatkan file konfigurasi iOS Firebase Anda (GoogleService-Info.plist).

      Anda dapat mendownload file konfigurasi iOS Firebase lagi kapan saja.

    2. Pindahkan file konfigurasi ke root project Xcode Anda. Jika diminta, pilih untuk menambahkan file konfigurasi ke semua target.

  4. Setelah Anda menambahkan kode inisialisasi, jalankan aplikasi untuk mengirimkan verifikasi ke Firebase console bahwa Anda telah berhasil menginstal Firebase.

Menambahkan SDK

Jika Anda menyiapkan project baru, Anda harus menginstal SDK. Anda mungkin sudah melakukannya sebagai bagian dari pembuatan project Firebase.

Sebaiknya, gunakan CocoaPods untuk menginstal library. Anda bisa menginstal Cocoapods dengan mengikuti petunjuk penginstalan. Jika tidak ingin menggunakan CocoaPods, Anda bisa mengintegrasikan framework SDK secara langsung tanpa menggunakan CocoaPods.

Jika Anda berencana untuk mendownload dan menjalankan salah satu sampel quickstart, project Xcode dan Podfile sudah tersedia, tetapi Anda perlu menginstal pod dan mendownload file GoogleService-Info.plist. Jika ingin mengintegrasikan library Firebase ke dalam salah satu project, Anda perlu menambahkan pod untuk library yang ingin digunakan.

  1. Jika Anda belum memiliki project Xcode, buatlah sekarang.

  2. Buat Podfile jika Anda belum memilikinya:

    $ cd your-project directory
    $ pod init
    
  3. Tambahkan pod yang ingin Anda instal. Anda bisa menyertakan Pod di Podfile seperti ini:

    pod 'Firebase/Core'
    pod 'Firebase/Messaging'
    

    Ini akan menambah library prasyarat yang diperlukan untuk mengaktifkan dan menjalankan Firebase dalam aplikasi iOS Anda, bersama dengan Google Analytics for Firebase. Daftar pod dan subspec yang saat ini tersedia bisa dilihat di bawah. Ini juga dihubungkan dalam panduan penyiapan fitur tertentu.

  4. Instal pod dan buka file .xcworkspace untuk melihat project di Xcode.

    $ pod install
    $ open your-project.xcworkspace
    
  5. Download file GoogleService-Info.plist dari Firebase console, lalu sertakan file tersebut ke dalam aplikasi.

Mengupload kunci autentikasi APN Anda

Upload kunci autentikasi APN Anda ke Firebase. Jika Anda belum memiliki kunci autentikasi APN, baca cara Mengonfigurasi APN dengan FCM.

  1. Pada project Anda di Firebase console, pilih ikon roda gigi, pilih Setelan Project, kemudian pilih tab Cloud Messaging.

  2. Di kunci autentikasi APN di bagian konfigurasi aplikasi iOS, klik tombol Upload.

  3. Buka lokasi tempat Anda menyimpan kunci, pilih kunci tersebut, lalu klik Buka. Tambahkan ID kunci untuk kunci tersebut (tersedia di Certificates, Identifiers & Profiles pada Apple Developer Member Center), lalu klik Upload.

Menginisialisasi Firebase di aplikasi Anda

Anda harus menambahkan kode inisialisasi Firebase ke aplikasi. Impor modul Firebase dan konfigurasi instance bersama seperti berikut ini:

  1. Impor modul Firebase di UIApplicationDelegate Anda:

    Swift

    import Firebase
    

    Objective-C

    @import Firebase;
    
  2. Konfigurasikan instance bersama FirebaseApp, yang biasanya ada dalam metode application:didFinishLaunchingWithOptions: aplikasi Anda:

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    

Mendaftar untuk notifikasi jarak jauh

Baik saat startup maupun pada titik lain yang Anda inginkan dalam alur proses aplikasi, daftarkan aplikasi Anda untuk mendapatkan notifikasi jarak jauh. Panggil registerForRemoteNotifications seperti yang ditunjukkan berikut:

Swift

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: {_, _ in })
} else {
  let settings: UIUserNotificationSettings =
  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Objective-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

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 penangan 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 latar belakang.

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 to dengan nilai seperti /topics/yourTopic. Developer bisa memilih nama topik apa pun yang cocok dengan ekspresi reguler: "/topics/[a-zA-Z0-9-_.~%]+".

Untuk mengirim ke kombinasi beberapa topik, server aplikasi harus menetapkan kunci condition (bukan kunci to) ke condition 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 mengenai kunci server aplikasi, lihat informasi referensi untuk protokol server koneksi pilihan Anda, HTTP atau XMPP. Contoh di halaman ini menunjukkan cara mengirim pesan ke topik, baik pada HTTP maupun XMPP.

Permintaan HTTP POST topik

Mengirim ke satu topik:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : /topics/foo-bar",
  "priority" : "high",
  "notification" : {
    "body" : "This is a Firebase Cloud Messaging Topic Message!",
    "title" : "FCM Message",
  }
}

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

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "condition": "'dogs' in topics || 'cats' in topics",
  "priority" : "high",
  "notification" : {
    "body" : "This is a Firebase Cloud Messaging Topic Message!",
    "title" : "FCM Message",
  }
}

Respons HTTP topik

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

Pesan XMPP topik

Mengirim ke satu topik:

<message id="">
  <gcm xmlns="google:mobile:data">

{
  "to" : /topics/foo-bar",
  "priority" : "high",
  "notification" : {
    "body" : "This is a Firebase Cloud Messaging Topic Message!",
    "title" : "FCM Message",
  }
}
  </gcm>
</message>

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

<message id="">
  <gcm xmlns="google:mobile:data">

{
  "condition": "'dogs' in topics || 'cats' in topics",
  "priority" : "high",
  "notification" : {
    "body" : "This is a Firebase Cloud Messaging Topic Message!",
    "title" : "FCM Message",
  }
}
  </gcm>
</message>

Respons XMPP topik

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

Perkirakan penundaan hingga 30 detik sebelum Server FCM menampilkan respons berhasil atau gagal untuk permintaan pengiriman topik. Karena itu, pastikan menyetel nilai waktu tunggu server aplikasi pada permintaan.

Untuk mengetahui daftar lengkap opsi pesan, baca informasi referensi untuk protokol server koneksi pilihan Anda, HTTP atau XMPP.

Langkah berikutnya

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.