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

如要透過 C++ 編寫跨平台 Firebase 雲端通訊用戶端應用程式,請使用 Firebase 雲端通訊 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
  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 通訊詳情請參閱 的 快速入門導覽課程範例 您可以下載、執行及查看

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

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