使用 C++ 設置 Firebase Cloud Messaging 客戶端應用程序

要編寫跨平台使用C火力地堡雲端通訊客戶端應用程序++,使用火力地堡雲端通訊API。 C++ SDK 適用於 Android 和 iOS,每個平台都需要一些額外的設置。

設置 Firebase 和 FCM SDK

安卓

  1. 如果你還沒有,添加火力地堡到C ++項目

    • 在鏈接的設置說明中,查看使用 Firebase C++ SDK 的設備和應用要求,包括使用 CMake 構建應用的建議。

    • 在項目級build.gradle文件,確保包括兩個你谷歌的Maven倉庫buildscriptallprojects部分。

  2. 創建一個火力地堡App對象,傳遞JNI環境和活動:

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

  3. 定義一個類實現了firebase::messaging::Listener接口。

  4. 初始化FCM,通過在App和構建監聽器:

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

  5. 依賴 Google Play 服務 SDK 的應用應在訪問功能之前檢查設備是否有兼容的 Google Play 服務 APK。要了解更多信息,請參閱檢查谷歌Play服務APK

iOS

  1. 你需要一個有效的APN證書。如果你不已經有一個,確保創建一個在蘋果開發者會員中心
  2. 如果你還沒有,添加火力地堡到C ++項目。然後,為 FCM 設置您的項目:
    1. 在項目的Podfile,增加FCM依賴性:
      pod 'Firebase/Messaging'
    2. 拖動firebase.frameworkfirebase_messaging.framework框架到從你的Xcode項目火力地堡C ++ SDK
  3. 配置您的 Xcode 項目以啟用推送通知:

    1. 請從導航區的項目。
    2. 選擇從編輯區域的項目目標。
    3. 選擇從編輯區常規選項卡。

      1. 向下滾動到鏈接的框架和庫,然後單擊+按鈕添加框架。
      2. 在窗口出現,滾動到UserNotifications.framework,點擊該條目,然後單擊添加

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

    4. 選擇從編輯區域功能選項卡。

      1. 切換推送通知
      2. 向下滾動到背景模式,然後將其轉換為
      3. 選擇背景下的遠程方式通知
  4. 創建一個火力地堡App對象:

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

  5. 定義一個類實現了firebase::messaging::Listener接口。

  6. 初始化火力地堡雲消息,通過在App和構建監聽器:

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

訪問設備註冊令牌

初始化 Firebase Cloud Messaging 庫後,會為客戶端應用程序實例請求註冊令牌。該應用程序將接收令牌與OnTokenReceived回調,應該在類中定義了實現firebase::messaging::Listener

如果要定位該特定設備,則需要訪問此令牌。

關於 Android 消息傳遞的注意事項

當應用程序根本沒有運行並且用戶點擊通知時,默認情況下,消息不會通過 FCM 的內置回調路由。在這種情況下,消息的有效載荷被通過接收Intent用於啟動該應用程序。有FCM著這些傳入消息的C ++庫的回調,你需要重寫方法onNewIntent在你的活動,並通過IntentMessageForwardingService

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需要與cusom偵聽器服務所取代。即通過去除默認實現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>

火力地堡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 上,分析)來防止在配置時生成。要做到這一點,元數據值添加到您Info.plist (不是你的GoogleService-Info.plist )在iOS上,或者你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>

iOS

FirebaseMessagingAutoInitEnabled = NO

要重新啟用 FCM,您可以進行運行時調用:

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

設置後,此值在應用程序重新啟動後仍然存在。

FCM 允許發送包含應用程序深層鏈接的消息。要接收包含深層鏈接的消息,您必須向處理應用深層鏈接的 Activity 添加新的 Intent 過濾器。意圖過濾器應捕獲域的深層鏈接。如果您的消息不包含深層鏈接,則不需要此配置。在 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>

當用戶點擊包含指向您指定的方案和主機的鏈接的通知時,您的應用程序將使用此 Intent 過濾器啟動 Activity 以處理該鏈接。

下一步

設置客戶端應用程序後,您就可以使用 Firebase 發送下游和主題消息。要了解更多信息,請參閱本功能中演示的快速啟動示例,您可以下載,運行,和審查。

要向您的應用程序添加其他更高級的行為,請參閱從應用程序服務器發送消息的指南:

請記住,你需要一個服務器實現以利用這些功能。