如要透過 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
介面的類別。初始化 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。 如果您尚未取得 APNs 驗證金鑰,請務必前往 Apple Developer Member Center 建立金鑰。
-
在 Firebase 控制台的專案中,選取 齒輪圖示,選取 「Project Settings」,然後選取 「雲端通訊」分頁。
-
在「iOS 應用程式設定」下方的「APNs 驗證金鑰」中, 按一下「上傳」圖示 按鈕。
-
瀏覽至儲存金鑰的位置,選取金鑰,然後按一下「Open」。加入金鑰的金鑰 ID (位於 Apple Developer Member Center 時,按一下 按一下「上傳」。
-
設定 Xcode 專案以啟用推播通知:
- 從導覽器區域選取專案。
- 從「Editor」區域選取專案目標。
選取「編輯器」區域中的「一般」分頁標籤。
- 向下捲動至「Linked Framework and Libraries」(已連結架構和程式庫),然後按一下 按下 + 按鈕新增架構。
在隨即顯示的視窗中,捲動至 UserNotification.framework,按一下該項目,然後點選 新增。
這個架構僅會出現在 Xcode 8 以上版本中,且是這個程式庫所需的架構。
選取「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
也有其他幾種較不常使用的方法。
這些值也可以覆寫,詳情請參閱 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);
設定後,這個值會在應用程式重新啟動時保留。
在 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 傳送下游和主題訊息。如需更多資訊,請參閱快速入門範例中展示的這項功能,您可以下載、執行及查看這項功能。
如要為應用程式新增其他進階行為,請參閱傳送指南 訊息:
請注意,你必須在 伺服器導入,以使用 接著介紹網際網路通訊層 包括兩項主要的安全防護功能