如要透過 C++ 編寫跨平台 Firebase Cloud Messaging 用戶端應用程式,請使用 Firebase Cloud Messaging API。 C++ SDK 同時適用於 Android 和 Apple 平台,但需要進行一些額外設定 各個平台。
設定 Firebase 和 FCM SDK
Android
如果還沒試過 將 Firebase 新增至您的 C++ 專案。
在連結設定的操作說明中,查看裝置和應用程式 Firebase C++ SDK 的使用需求,包括 建議您使用 CMake 建構應用程式。
請務必在專案層級的
build.gradle
檔案中納入 位於buildscript
和 的 Google Maven 存放區allprojects
個版面。
建立 Firebase App 物件,傳入 JNI 環境,並 活動:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
定義實作
firebase::messaging::Listener
的類別 存取 API初始化 FCM,並傳入應用程式和建構的事件監聽器:
::firebase::messaging::Initialize(app, listener);
仰賴 Google Play 服務 SDK 的應用程式應檢查裝置 或相容的 Google Play 服務 APK,再存取相關功能。 詳情請參閱 檢查 Google Play 服務 APK。
iOS+
- 如果還沒試過
將 Firebase 新增至您的 C++ 專案。接著:
設定 FCM 專案:
- 在專案的 Podfile 中新增 FCM 依附元件:
pod 'FirebaseMessaging'
- 拖曳
firebase.framework
和firebase_messaging.framework
新增至 Firebase C++ SDK 的 Xcode 專案。
- 在專案的 Podfile 中新增 FCM 依附元件:
將 APN 驗證金鑰上傳至 Firebase。 如果您還沒有 APN 驗證金鑰,請務必前往 Apple Developer Member Center。
-
在 Firebase 控制台的專案中,選取 齒輪圖示,選取 「Project Settings」,然後選取 「雲端通訊」分頁。
-
在「iOS 應用程式設定」下方的「APNs 驗證金鑰」中, 按一下「上傳」圖示 按鈕。
-
瀏覽至儲存金鑰的位置並選取金鑰,然後按一下 開啟。加入金鑰的金鑰 ID (位於 Apple Developer Member Center 時,按一下 按一下「上傳」。
-
設定 Xcode 專案以啟用推播通知:
- 從導覽器區域選取專案。
- 從「Editor」區域選取專案目標。
選取「編輯器」區域中的「一般」分頁標籤。
- 向下捲動至「Linked Framework and Libraries」(已連結架構和程式庫),然後按一下 按下 + 按鈕新增架構。
在隨即顯示的視窗中,捲動至 UserNotification.framework,按一下該項目,然後點選 新增。
此架構只會顯示在 Xcode v8 以上版本中, 必須加入這個程式庫所需的函式
選取「Editor」區域的「Capabilities」分頁標籤。
- 將「推播通知」切換為「開啟」。
- 向下捲動至「背景模式」,然後將設定切換為「開啟」。
- 選取「背景模式」下方的「遠端通知」。
建立 Firebase 應用程式物件:
app = ::firebase::App::Create(::firebase::AppOptions());
定義實作
firebase::messaging::Listener
的類別 存取 API初始化 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 以上版本) 會使用 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
:
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);
設定這個值後,每次重新啟動的應用程式都會保留這個值。
在 Android 上使用深層連結處理訊息
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 通訊詳情請參閱 的 快速入門導覽課程範例 您可以下載、執行及查看
如要為應用程式新增其他進階行為,請參閱傳送指南 訊息:
請注意,你必須在 伺服器導入,以使用 接著介紹網際網路通訊層 包括兩項主要的安全防護功能