使用 C++ 設定 Firebase 雲端通訊用戶端應用程式

如要透過 C++ 編寫跨平台 Firebase Cloud Messaging 用戶端應用程式,請使用 Firebase Cloud Messaging API。 C++ SDK 同時適用於 Android 和 Apple 平台,但需要進行一些額外設定 各個平台。

設定 Firebase 和 FCM SDK

Android

  1. 如果還沒試過 將 Firebase 新增至您的 C++ 專案

    • 在連結設定的操作說明中,查看裝置和應用程式 Firebase C++ SDK 的使用需求,包括 建議您使用 CMake 建構應用程式。

    • 請務必在專案層級的 build.gradle 檔案中納入 位於 buildscript 和 的 Google Maven 存放區 allprojects 個版面。

    ,瞭解如何調查及移除這項存取權。
  2. 建立 Firebase App 物件,傳入 JNI 環境,並 活動:

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

  3. 定義實作 firebase::messaging::Listener 的類別 存取 API

  4. 初始化 FCM,並傳入應用程式和建構的事件監聽器:

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

  5. 仰賴 Google Play 服務 SDK 的應用程式應檢查裝置 或相容的 Google Play 服務 APK,再存取相關功能。 詳情請參閱 檢查 Google Play 服務 APK

iOS+

  1. 如果還沒試過 將 Firebase 新增至您的 C++ 專案。接著: 設定 FCM 專案:
    1. 在專案的 Podfile 中新增 FCM 依附元件:
      pod 'FirebaseMessaging'
    2. 拖曳 firebase.frameworkfirebase_messaging.framework 新增至 Firebase C++ SDK 的 Xcode 專案。
  2. 將 APN 驗證金鑰上傳至 Firebase。 如果您還沒有 APN 驗證金鑰,請務必前往 Apple Developer Member Center

    1. Firebase 控制台的專案中,選取 齒輪圖示,選取 「Project Settings」,然後選取 「雲端通訊」分頁。

    2. 在「iOS 應用程式設定」下方的「APNs 驗證金鑰」中, 按一下「上傳」圖示 按鈕。

    3. 瀏覽至儲存金鑰的位置並選取金鑰,然後按一下 開啟。加入金鑰的金鑰 ID (位於 Apple Developer Member Center 時,按一下 按一下「上傳」

  3. 設定 Xcode 專案以啟用推播通知:

    1. 導覽器區域選取專案。
    2. 「Editor」區域選取專案目標。
    3. 選取「編輯器」區域中的「一般」分頁標籤

      1. 向下捲動至「Linked Framework and Libraries」(已連結架構和程式庫),然後按一下 按下 + 按鈕新增架構。
      2. 在隨即顯示的視窗中,捲動至 UserNotification.framework,按一下該項目,然後點選 新增

        此架構只會顯示在 Xcode v8 以上版本中, 必須加入這個程式庫所需的函式

    4. 選取「Editor」區域的「Capabilities」分頁標籤

      1. 將「推播通知」切換為「開啟」
      2. 向下捲動至「背景模式」,然後將設定切換為「開啟」
      3. 選取「背景模式」下方的「遠端通知」
  4. 建立 Firebase 應用程式物件:

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

  5. 定義實作 firebase::messaging::Listener 的類別 存取 API

  6. 初始化 Firebase 雲端通訊,傳入應用程序和建構而成 監聽器:

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

存取裝置註冊權杖

初始化 Firebase 雲端通訊程式庫後,註冊符記會 來處理用戶端應用程式執行個體的要求。應用程式會收到 OnTokenReceived 回呼,應在實作的 firebase::messaging::Listener

如果您要指定特定裝置,就必須取得這個權杖的存取權。

關於在 Android 上傳送訊息的注意事項

假如應用程式完全未執行,且使用者輕觸通知, 根據預設,訊息不會透過 FCM 的內建功能轉送 回呼函式。在此情況下,訊息酬載會透過 Intent 接收 並用於啟動應用程式如要讓 FCM 轉寄這些收到的訊息 C++ 程式庫回呼的訊息,您需要覆寫該方法 在「活動」中使用 onNewIntent,並將 Intent 傳遞至 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);
  }
}

應用程式在背景執行時收到的訊息內容含有以下內容: 用於填入系統匣通知的通知欄位,但 系統不會將通知內容提供給 FCM。也就是說 Message::notification 為空值。

簡單來說:

應用程式狀態 通知 資料 兩者並用
前景 OnMessageReceived OnMessageReceived OnMessageReceived
背景 系統匣 OnMessageReceived 通知:系統匣
資料:就意圖的額外資料。

Android 上的自訂訊息處理

根據預設,傳送到應用程式的通知會傳遞給 ::firebase::messaging::Listener::OnMessageReceived,但在某些情況下,您 想要覆寫預設行為時如要在 Android 裝置上使用這項功能 撰寫可擴充的自訂類別 並更新您的 com.google.firebase.messaging.cpp.ListenerService 專案的AndroidManifest.xml

覆寫 ListenerService 方法。

ListenerService 是 Java 類別,會攔截傳送至接收的訊息 並轉送至 C++ 程式庫。應用程式在前景運作時 (或當應用程式為背景,且收到純資料酬載時)。 訊息會通過此類別提供的其中一個回呼。新增 自訂行為來處理訊息,您需要擴充 FCM 的 預設 ListenerService

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

class MyListenerService extends ListenerService {

覆寫 ListenerService.onMessageReceived 方法即可 根據接收過的 RemoteMessage 物件,並取得訊息資料:

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

ListenerService 也有其他幾種較不常使用的方法。 這些項目也可以覆寫,詳情請參閱 Firebase 訊息服務 參照。

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

更新「AndroidManifest.xml

寫入自訂類別後,必須加入 AndroidManifest.xml後才會生效。確認資訊清單包含 在 <manifest> 標記中宣告適當的屬性,即可使用合併工具。 如下所示:

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

firebase_messaging_cpp.aar 封存檔中有AndroidManifest.xml 檔案,宣告 FCM 的預設 ListenerService。這份資訊清單 通常會與專案專屬的資訊清單合併 可以執行 ListenerService。這個ListenerService必須取代為 接聽程式監聽器服務做法是移除預設設定 ListenerService 並新增自訂 Service,可透過 然後在專案 AndroidManifest.xml 檔案中新增下列程式碼:

<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 (7.1.0 以上版本) 會使用 JobIntentServiceAndroidManifest.xml 檔案進行其他修改。

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

避免自動初始化

FCM 會產生用於指定裝置的註冊權杖。 產生權杖後,程式庫會上傳 和設定資料傳送至 Firebase如果想 在使用權杖前選擇加入,以及執行指令碼中的 停用 FCM (以及 Android 和 Analytics)。方法是將中繼資料值新增至 你在 Apple 平台上的Info.plist (而非 GoogleService-Info.plist)、 或您在 Android 上的 AndroidManifest.xml

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

如要重新啟用 FCM,您可以發起執行階段呼叫:

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

設定這個值後,每次重新啟動的應用程式都會保留這個值。

FCM 允許傳送含有應用程式深層連結的訊息。 如要接收包含深層連結的訊息,您必須新增意圖篩選器 針對應用程式處理深層連結的活動。意圖篩選器 擷取您網域的深層連結。如果訊息沒有深層連結 因此不需要進行這項設定在 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>

您也可以指定萬用字元,提高意圖篩選器的準確度 靈活彈性例如:

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

當使用者輕觸含有配置連結的通知, 應用程式就會使用這個意圖篩選器啟動活動,以處理 連結。

後續步驟

設定用戶端應用程式後,您就可以傳送下游和主題了 來建立與 Firebase 通訊詳情請參閱 的 快速入門導覽課程範例 您可以下載、執行及查看

如要為應用程式新增其他進階行為,請參閱傳送指南 訊息:

請注意,你必須在 伺服器導入,以使用 接著介紹網際網路通訊層 包括兩項主要的安全防護功能