要使用 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 发送下游消息和主题消息了。要了解更多信息,请参阅快速入门示例中演示的此功能,您可以下载、运行和查看该示例。
要向您的应用添加其他更高级的行为,请参阅从应用服务器发送消息的指南:
请记住,您需要一个服务器实现才能使用这些功能。