Menyiapkan aplikasi klien Firebase Cloud Messaging dengan C++

Untuk menulis aplikasi klien Firebase Cloud Messaging lintas platform dengan C++, gunakan Firebase Cloud Messaging. C++ SDK dapat digunakan untuk Android dan Apple, dengan sejumlah penyiapan tambahan di tiap platform.

Menyiapkan Firebase dan FCM SDK

Android

  1. Tambahkan Firebase ke project C++ jika belum melakukannya.

    • Dalam petunjuk penyiapan tertaut, tinjau persyaratan perangkat dan aplikasi untuk menggunakan FirebaseC++ SDK, termasuk rekomendasi penggunaan CMake untuk mem-build aplikasi Anda.

    • Dalam file build.gradle level project, pastikan Anda memasukkan repositori Maven Google di bagian buildscript dan allprojects.

  2. Buat objek Firebase App, dengan meneruskan lingkungan dan Aktivitas JNI:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. Tentukan class yang mengimplementasikan antarmuka firebase::messaging::Listener.

  4. Lakukan inisialisasi FCM, dengan meneruskan objek Firebase App dan Pemroses yang telah dibuat:

    ::firebase::messaging::Initialize(app, listener);

  5. Aplikasi yang bergantung pada SDK layanan Google Play harus memeriksa kompatibilitas perangkat terhadap APK layanan Google Play sebelum mengakses fitur tersebut. Untuk mempelajari lebih lanjut, lihat Pemeriksaan untuk APK layanan Google Play.

iOS+

  1. Tambahkan Firebase ke project C++ jika belum melakukannya. Lalu, untuk menyiapkan project untuk FCM:
    1. Di Podfile project, tambahkan dependensi FCM:
      pod 'FirebaseMessaging'
    2. Tarik framework firebase.framework dan firebase_messaging.framework ke project Xcode dari Firebase C++ SDK.
  2. Upload kunci autentikasi APN Anda ke Firebase. Jika Anda belum memiliki kunci autentikasi APN, pastikan untuk membuatnya di Apple Developer Member Center.

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

    2. Di APNs authentication key di bagian iOS app configuration, klik tombol Upload.

    3. Cari lokasi penyimpanan kunci, pilih lokasi tersebut, lalu klik Open. Tambahkan ID kunci tersebut (tersedia di Apple Developer Member Center) dan klik Upload.

  3. Konfigurasikan project Xcode untuk mengaktifkan Notifikasi Push:

    1. Pilih project dari Navigator area.
    2. Pilih target project dari Editor area.
    3. Pilih tab General dari Editor area.

      1. Scroll ke bawah ke Linked Frameworks and Libraries, lalu klik tombol + untuk menambahkan framework.
      2. Di jendela yang muncul, scroll ke UserNotifications.framework, klik entri tersebut, lalu klik Add.

        Framework ini hanya akan muncul di Xcode v8 dan yang lebih baru, dan diwajibkan oleh library ini.

    4. Pilih tab Capabilities dari Editor area.

      1. Alihkan Push Notifications ke On.
      2. Scroll ke bawah ke Background Modes, lalu alihkan ke On.
      3. Pilih Remote notifications di bagian Background Modes.
  4. Buat objek Firebase App:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. Tentukan class yang mengimplementasikan antarmuka firebase::messaging::Listener.

  6. Lakukan inisialisasi Firebase Cloud Messaging, dengan meneruskan object Firebase App dan Pemroses yang telah dibuat:

    ::firebase::messaging::Initialize(app, listener);

Mengakses token pendaftaran perangkat

Setelah menginisialisasi library Firebase Cloud Messaging, token pendaftaran akan diminta untuk instance aplikasi klien. Aplikasi akan menerima token tersebut dengan callback OnTokenReceived, yang harus ditentukan di class yang mengimplementasikan firebase::messaging::Listener.

Jika ingin menarget perangkat tertentu, Anda memerlukan akses ke token ini.

Catatan tentang pengiriman pesan di Android

Saat aplikasi tidak berjalan sama sekali dan pengguna mengetuk sebuah notifikasi, secara default pesannya tidak dirutekan melalui callback bawaan FCM. Dalam kasus ini, payload pesan diterima melalui Intent yang digunakan untuk memulai aplikasi. Agar FCM meneruskan pesan masuk ini ke callback library C++, Anda perlu mengganti metode onNewIntent dalam Activity Anda dan meneruskan Intent ke MessageForwardingService.

import com.google.firebase.messaging.MessageForwardingService;

class MyActivity extends Activity {
  private static final String TAG = "MyActvity";

  @Override
  protected void onNewIntent(Intent intent) {
    Log.d(TAG, "A message was sent to this app while it was in the background.");
    Intent message = new Intent(this, MessageForwardingService.class);
    message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
    message.putExtras(intent);
    message.setData(intent.getData());
    // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
    // startService(message);
    MessageForwardingService.enqueueWork(this, message);
  }
}

Untuk pesan yang diterima saat aplikasi berada di latar belakang, isi kolom notifikasinya akan digunakan untuk mengisi notifikasi baki sistem, namun isi notifikasi tersebut tidak akan disampaikan ke FCM. Artinya, Message::notification akan kosong.

Rangkuman:

Status aplikasi Notifikasi Data Keduanya
Latar depan OnMessageReceived OnMessageReceived OnMessageReceived
Latar belakang Baki sistem OnMessageReceived Notifikasi: baki sistem
Data: di bagian tambahan intent.

Penanganan Pesan Kustom di Android

Secara default, notifikasi yang dikirim ke aplikasi diteruskan ke ::firebase::messaging::Listener::OnMessageReceived, namun dalam beberapa kasus Anda mungkin ingin mengganti perilaku default. Untuk melakukannya di Android, Anda perlu menulis class kustom yang memperluas com.google.firebase.messaging.cpp.ListenerService serta memperbarui AndroidManifest.xml project Anda.

Mengganti Metode ListenerService

ListenerService adalah class Java yang mencegah pesan masuk yang dikirim ke aplikasi dan merutekannya ke library C++. Saat aplikasi berada di latar depan (atau saat aplikasi menjadi latar belakang dan menerima payload data saja), pesan akan diteruskan ke salah satu callback yang disediakan di class ini. Untuk menambahkan perilaku kustom ke penanganan pesan, Anda perlu memperluas FCM default ListenerService:

import com.google.firebase.messaging.cpp.ListenerService;

class MyListenerService extends ListenerService {

Dengan mengganti metode ListenerService.onMessageReceived, Anda dapat melakukan tindakan berdasarkan objek RemoteMessage yang diterima dan mendapatkan data pesan:

@Override
public void onMessageReceived(RemoteMessage message) {
  Log.d(TAG, "A message has been received.");
  // Do additional logic...
  super.onMessageReceived(message);
}

ListenerService juga memiliki beberapa metode lain yang jarang digunakan. Metode ini dapat diganti juga. Untuk informasi lebih lanjut, lihat referensi FirebaseMessagingService.

@Override
public void onDeletedMessages() {
  Log.d(TAG, "Messages have been deleted on the server.");
  // Do additional logic...
  super.onDeletedMessages();
}

@Override
public void onMessageSent(String messageId) {
  Log.d(TAG, "An outgoing message has been sent.");
  // Do additional logic...
  super.onMessageSent(messageId);
}

@Override
public void onSendError(String messageId, Exception exception) {
  Log.d(TAG, "An outgoing message encountered an error.");
  // Do additional logic...
  super.onSendError(messageId, exception);
}

Update AndroidManifest.xml

Setelah ditulis, class kustom harus disertakan dalam AndroidManifest.xml agar dijalankan. Pastikan manifes menyertakan alat penggabung dengan mendeklarasikan atribut yang sesuai di dalam tag <manifest>, seperti:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.messaging.cpp.samples"
    xmlns:tools="http://schemas.android.com/tools">

Dalam arsip firebase_messaging_cpp.aar terdapat file AndroidManifest.xml yang mendeklarasikan FCM default ListenerService. Manifes ini biasanya digabungkan dengan manifes khusus project agar ListenerService dapat dijalankan. ListenerService ini perlu diganti dengan layanan pemroses kustom. Hal itu dilakukan dengan menghapus ListenerService default dan menambahkan layanan kustom, yang dapat dilakukan dengan baris berikut dalam file AndroidManifest.xml project Anda:

<service android:name="com.google.firebase.messaging.cpp.ListenerService"
         tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService"
         android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT"/>
  </intent-filter>
</service>

Firebase C++ SDK versi baru (7.1.0 dan berikutnya) menggunakan JobIntentService yang memerlukan modifikasi tambahan di file AndroidManifest.xml.

<service android:name="com.google.firebase.messaging.MessageForwardingService"
     android:permission="android.permission.BIND_JOB_SERVICE"
     android:exported="false" >
</service>

Mencegah inisialisasi otomatis

FCM membuat token pendaftaran untuk penargetan perangkat. Saat token dibuat, library mengupload ID dan data konfigurasi ke Firebase. Jika menginginkan keikutsertaan eksplisit sebelum menggunakan token, Anda dapat mencegah pembuatan pada waktu konfigurasi dengan menonaktifkan FCM (dan di Android, Analytics). Untuk melakukan ini, tambahkan nilai metadata ke Info.plist (bukan GoogleService-Info.plist) di platform Apple, atau AndroidManifest.xml di Android:

Android

<?xml version="1.0" encoding="utf-8"?>
<application>
  <meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" />
  <meta-data android:name="firebase_analytics_collection_enabled"
             android:value="false" />
</application>

Swift

FirebaseMessagingAutoInitEnabled = NO

Untuk mengaktifkan kembali FCM, Anda dapat membuat panggilan runtime:

::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);

Nilai ini akan tetap sama setiap kali aplikasi dimulai ulang.

FCM memungkinkan pengiriman pesan yang berisi deep link ke aplikasi Anda. Untuk menerima pesan yang berisi deep link, Anda harus menambahkan filter intent baru ke aktivitas yang menangani deep link untuk aplikasi Anda. Filter intent harus menangkap deep link domain Anda. Jika pesan Anda tidak mengandung deep link, konfigurasi ini tidak diperlukan. Pada AndroidManifest.xml:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/>
  <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/>
</intent-filter>

Anda juga dapat menentukan karakter pengganti agar filter intent lebih fleksibel. Contoh:

<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="*.example.com" android:scheme="http"/>
  <data android:host="*.example.com" android:scheme="https"/>
</intent-filter>

Ketika pengguna mengetuk notifikasi yang berisi link ke skema dan host yang Anda tentukan, aplikasi akan memulai aktivitas dengan filter intent ini untuk menangani link.

Langkah berikutnya

Setelah menyiapkan aplikasi klien, Anda siap untuk mengirimkan pesan downstream dan pesan topik dengan Firebase. Untuk mempelajari lebih lanjut, lihat fungsi ini sebagaimana ditunjukkan di sampel panduan memulai yang dapat Anda download, jalankan, dan tinjau.

Untuk menambahkan perilaku lebih canggih lainnya ke aplikasi Anda, lihat panduan mengenai cara mengirimkan pesan dari server aplikasi:

Perlu diingat bahwa Anda memerlukan penerapan pada server untuk menggunakan fitur ini.