使用 C++ 設定 Firebase Cloud Messaging 用戶端應用

若要使用 C++ 編寫跨平台 Firebase Cloud Messaging 用戶端應用,請使用Firebase Cloud Messaging API。 C++ SDK 適用於 Android 和 Apple 平台,每個平台都需要一些額外的設定。

設定 Firebase 和 FCM SDK

安卓

  1. 如果您尚未將Firebase 新增至您的 C++ 專案中,請將其新增至您的 C++ 專案

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

    • 在專案級build.gradle檔案中,請確保在buildscriptallprojects部分中包含 Google 的 Maven 儲存庫。

  2. 建立Firebase App對象,傳入JNI環境與Activity:

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

  3. 定義一個實作firebase::messaging::Listener介面的類別。

  4. 初始化FCM,傳入App與建構的Listener:

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

  5. 依賴 Google Play 服務 SDK 的應用程式應在存取功能之前檢查裝置是否有相容的 Google Play 服務 APK。要了解更多信息,請參閱檢查 Google Play 服務 APK

iOS+

  1. 您需要有效的APNs憑證。如果您還沒有,請確保在Apple 開發者會員中心創建一個。
  2. 如果您尚未將Firebase 新增至您的 C++ 專案中,請將其新增至您的 C++ 專案。然後,為 FCM 設定您的項目:
    1. 在專案的 Podfile 中,新增 FCM 依賴項:
      pod 'FirebaseMessaging'
    2. firebase.frameworkfirebase_messaging.framework框架從Firebase C++ SDK拖曳到您的 Xcode 專案中。
  3. 配置您的 Xcode 專案以啟用推播通知:

    1. 導航器區域中選擇項目。
    2. 編輯器區域選擇專案目標。
    3. 編輯器區域中選擇常規標籤。

      1. 向下捲動到連結的框架和庫,然後點擊+按鈕以新增框架。
      2. 在出現的視窗中,捲動到UserNotifications.framework ,按一下該條目,然後按一下Add

        該框架僅出現在 Xcode v8 及更高版本中,並且是該庫所必需的。

    4. 編輯器區域中選擇“功能”標籤。

      1. 將推播通知切換為
      2. 向下捲動至「後台模式」 ,然後將其切換為「開」
      3. 選擇“後台模式”下的“遠端通知”
  4. 建立 Firebase 應用程式物件:

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

  5. 定義一個實作firebase::messaging::Listener介面的類別。

  6. 初始化 Firebase Cloud Messaging,傳入 App 和建構的監聽器:

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

訪問設備註冊令牌

初始化 Firebase Cloud Messaging 函式庫時,會要求客戶端應用實例的註冊令牌。應用程式將透過OnTokenReceived回呼接收令牌,該回呼應在實作firebase::messaging::Listener的類別中定義。

如果您想定位該特定設備,則需要存取此令牌。

Android 上訊息傳遞的注意事項

當應用程式根本沒有運行且用戶點擊通知時,預設情況下,訊息不會透過 FCM 的內建回調進行路由。在這種情況下,訊息有效負載是透過用於啟動應用程式的Intent接收的。要讓 FCM 將這些傳入訊息轉送到 C++ 函式庫回呼,您需要重寫 Activity 中的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 產生用於裝置定位的註冊令牌。產生令牌後,庫會將識別碼和配置資料上傳到 Firebase。如果您想在使用令牌之前獲得明確的選擇加入,您可以透過停用 FCM(以及 Android 上的 Analytics)來防止在配置時產生。為此,請將元資料值新增至 Apple 平台上的Info.plist (不是GoogleService-Info.plist )或 Android 上的AndroidManifest.xml中:

安卓

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

迅速

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 發送下游訊息和主題訊息。要了解更多信息,請參閱快速入門示例中演示的此功能,您可以下載、運行和查看該示例。

若要為您的應用程式新增其他更進階的行為,請參閱從應用程式伺服器傳送訊息的指南:

請記住,您需要一個伺服器實作才能使用這些功能。