要使用 C++ 編寫跨平台 Firebase 雲消息傳遞客戶端應用程序,請使用Firebase 雲消息傳遞API。 C++ SDK 適用於 Android 和 Apple 平台,每個平台都需要一些額外的設置。
設置 Firebase 和 FCM SDK
安卓
如果您還沒有,請將 Firebase 添加到您的 C++ 項目中。
在鏈接的設置說明中,查看使用 Firebase C++ SDK 的設備和應用要求,包括使用 CMake 構建應用的建議。
在您的項目級
build.gradle
文件中,確保在您的buildscript
和allprojects
部分中包含 Google 的 Maven 存儲庫。
創建一個Firebase App對象,傳入JNI環境和Activity:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
定義一個實現
firebase::messaging::Listener
接口的類。初始化FCM,傳入App和構造好的Listener:
::firebase::messaging::Initialize(app, listener);
依賴 Google Play 服務 SDK 的應用程序應在訪問這些功能之前檢查設備是否有兼容的 Google Play 服務 APK。要了解更多信息,請參閱檢查 Google Play 服務 APK 。
iOS+
- 您需要有效的APNs證書。如果您還沒有,請務必在Apple Developer Member Center創建一個。
- 如果您還沒有,請將 Firebase 添加到您的 C++ 項目中。然後,為 FCM 設置項目:
- 在項目的 Podfile 中,添加 FCM 依賴項:
pod 'FirebaseMessaging'
- 將
firebase.framework
和firebase_messaging.framework
框架從Firebase C++ SDK拖到您的 Xcode 項目中。
- 在項目的 Podfile 中,添加 FCM 依賴項:
配置您的 Xcode 項目以啟用推送通知:
- 從Navigator 區域選擇項目。
- 從編輯器區域選擇項目目標。
從編輯器區域選擇常規選項卡。
- 向下滾動到Linked Frameworks and Libraries ,然後單擊+按鈕添加框架。
在出現的窗口中,滾動到UserNotifications.framework ,單擊該條目,然後單擊Add 。
此框架僅出現在 Xcode v8 及更高版本中,並且是此庫所必需的。
從Editor 區域中選擇Capabilities選項卡。
- 將推送通知切換為開。
- 向下滾動到“背景模式” ,然後將其切換到“開” 。
- 在後台模式下選擇遠程通知。
創建一個 Firebase 應用程序對象:
app = ::firebase::App::Create(::firebase::AppOptions());
定義一個實現
firebase::messaging::Listener
接口的類。初始化Firebase Cloud Messaging,傳入App和構造好的Listener:
::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);
一旦設置,此值將在應用重新啟動時持續存在。
在 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 過濾器更加靈活。例如:
<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 發送下游消息和主題消息了。要了解更多信息,請參閱快速入門示例中演示的此功能,您可以下載、運行和查看該示例。
要向您的應用添加其他更高級的行為,請參閱從應用服務器發送消息的指南:
請記住,您需要一個服務器實現才能使用這些功能。
,要使用 C++ 編寫跨平台 Firebase 雲消息傳遞客戶端應用程序,請使用Firebase 雲消息傳遞API。 C++ SDK 適用於 Android 和 Apple 平台,每個平台都需要一些額外的設置。
設置 Firebase 和 FCM SDK
安卓
如果您還沒有,請將 Firebase 添加到您的 C++ 項目中。
在鏈接的設置說明中,查看使用 Firebase C++ SDK 的設備和應用要求,包括使用 CMake 構建應用的建議。
在您的項目級
build.gradle
文件中,確保在您的buildscript
和allprojects
部分中包含 Google 的 Maven 存儲庫。
創建一個Firebase App對象,傳入JNI環境和Activity:
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
定義一個實現
firebase::messaging::Listener
接口的類。初始化FCM,傳入App和構造好的Listener:
::firebase::messaging::Initialize(app, listener);
依賴 Google Play 服務 SDK 的應用程序應在訪問這些功能之前檢查設備是否有兼容的 Google Play 服務 APK。要了解更多信息,請參閱檢查 Google Play 服務 APK 。
iOS+
- 您需要有效的APNs證書。如果您還沒有,請務必在Apple Developer Member Center創建一個。
- 如果您還沒有,請將 Firebase 添加到您的 C++ 項目中。然後,為 FCM 設置項目:
- 在項目的 Podfile 中,添加 FCM 依賴項:
pod 'FirebaseMessaging'
- 將
firebase.framework
和firebase_messaging.framework
框架從Firebase C++ SDK拖到您的 Xcode 項目中。
- 在項目的 Podfile 中,添加 FCM 依賴項:
配置您的 Xcode 項目以啟用推送通知:
- 從Navigator 區域選擇項目。
- 從編輯器區域選擇項目目標。
從編輯器區域選擇常規選項卡。
- 向下滾動到Linked Frameworks and Libraries ,然後單擊+按鈕添加框架。
在出現的窗口中,滾動到UserNotifications.framework ,單擊該條目,然後單擊Add 。
此框架僅出現在 Xcode v8 及更高版本中,並且是此庫所必需的。
從Editor 區域中選擇Capabilities選項卡。
- 將推送通知切換為開。
- 向下滾動到“背景模式” ,然後將其切換到“開” 。
- 在後台模式下選擇遠程通知。
創建一個 Firebase 應用程序對象:
app = ::firebase::App::Create(::firebase::AppOptions());
定義一個實現
firebase::messaging::Listener
接口的類。初始化Firebase Cloud Messaging,傳入App和構造好的Listener:
::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);
一旦設置,此值將在應用重新啟動時持續存在。
在 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 過濾器更加靈活。例如:
<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 發送下游消息和主題消息了。要了解更多信息,請參閱快速入門示例中演示的此功能,您可以下載、運行和查看該示例。
要向您的應用添加其他更高級的行為,請參閱從應用服務器發送消息的指南:
請記住,您需要一個服務器實現才能使用這些功能。