使用 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 介面的類別。

  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。 如果您尚未取得 APNs 驗證金鑰,請務必前往 Apple Developer Member Center 建立金鑰。

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

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

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

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

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

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

        這個架構僅會出現在 Xcode 8 以上版本中,且是這個程式庫所需的架構。

    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 也有其他幾種較不常使用的方法。 這些值也可以覆寫,詳情請參閱 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);
}

更新「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 並新增自訂服務,您可以使用專案 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 以上版本) 使用 JobIntentService,因此需要在 AndroidManifest.xml 檔案中進行額外修改。

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

避免自動初始化

FCM 會產生用於指定裝置的註冊權杖。 產生權杖後,程式庫會將 ID 和設定資料上傳至 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 傳送下游和主題訊息。如需更多資訊,請參閱快速入門範例中展示的這項功能,您可以下載、執行及查看這項功能。

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

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