使用 C++ 设置 Firebase 云消息传递客户端应用

要使用 C++ 编写您的跨平台 Firebase 云消息传递客户端应用,请使用 Firebase Cloud Messaging API。C++ SDK 适用于 Android 和 iOS,但这两个平台都还需要一些额外设置。

设置 Firebase 和 FCM SDK

Android

  1. FCM 客户端应用需要在运行 Android 4.0 或更高版本的设备上运行,这些设备还需要安装 Google Play 服务应用并且必须是使用 Gradle 及 Android Studio 1.4 或更高版本构建的。
  2. 如果您尚未将 Firebase 添加到您的 C++ 项目,请先添加。
  3. 在 Android Studio 中,将 FCM 依赖项添加至您的应用级 build.gradle 文件:
    repositories {
    flatDir {
    dirs project.ext.firebase_cpp_sdk_dir + "/libs/android"
    }
    }
    dependencies {
     implementation 'com.google.firebase:firebase-messaging:17.3.4'
     implementation 'com.google.firebase.messaging.cpp:firebase_messaging_cpp@aar'
    }
  4. 链接 C++ SDK 中的 libapp.alibmessaging.a 静态库。
  5. 创建一个在 JNI 环境和 Activity 中传递内容的 Firebase 应用对象:
    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
    
  6. 定义一个实现 firebase::messaging::Listener 接口的类。
  7. 初始化 Firebase 云消息传递,并传入该应用对象和构建好的侦听器:
    ::firebase::messaging::Initialize(app, listener);
    
  8. 依靠 Play 服务 SDK 运行的应用在访问各项功能之前,应检查设备是否拥有兼容的 Google Play 服务 APK。如需了解更多信息,请参阅检查 Google Play 服务 APK

iOS

  1. 您需要一个有效的 APNs 证书。如果您尚未拥有有效的证书,请参阅配置 APNs SSL 证书
  2. 如果您尚未将 Firebase 添加到您的 C++ 项目,请先添加。
  3. 在项目的 Podfile 中,添加 FCM 依赖项:
    pod 'Firebase/Messaging'
  4. firebase.frameworkfirebase_messaging.framework 框架从 C++ SDK 拖动到您的 Xcode 项目中。
  5. 配置 Xcode 项目以启用推送通知:
    1. Navigator 区域 中选择该项目。
    2. Editor 区域中选择项目目标。
    3. Editor 区域中选择 General 标签。
    4. 向下滚动到 Linked Frameworks and Libraries,然后点击 + 按钮添加框架。
      • 在显示的窗口中,滚动到 UserNotifications.framework 并点击该条目,然后点击 Add。此框架仅显示在此库要求使用的 Xcode 8 及更高版本中。
    5. Editor 区域中选择 General 标签。
    6. Push Notifications 切换为 On
    7. 向下滚动到 Background Modes,然后将其切换为 On
    8. 勾选 Background Modes 下的 Remote notifications 框。
  6. 创建一个 Firebase 应用对象:
    app = ::firebase::App::Create(::firebase::AppOptions());
  7. 定义一个实现 firebase::messaging::Listener 接口的类。
  8. 初始化 Firebase 云消息传递,并传入该应用对象和一个已构建好的侦听器:
    ::firebase::messaging::Initialize(app, listener);

获取设备注册令牌

初始化 Firebase 云消息传递库时,将为客户端应用实例请求一个注册令牌。应用将通过 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());
    startService(message);
  }
}

当应用在后台时,用户设备接收到的消息会将其通知字段的内容用于填充系统任务栏通知,但该通知内容并不会传输给 FCM。也就是说,Message::notification 将为空。

总结:

应用状态 通知 数据 两者
前台 OnMessageReceived OnMessageReceived OnMessageReceived
后台 系统任务栏 OnMessageReceived 通知:系统任务栏
数据:intent 的 extras 参数。

Android 上的自定义消息处理

默认情况下,发送到应用的通知均传递到 ::firebase::messaging::Listener::OnMessageReceived,但在某些情况下,您可能需要覆盖默认行为。要在 Android 上执行此操作,您需要编写可扩展 com.google.firebase.messaging.cpp.ListenerService 的自定义类,并更新项目的 AndroidManifest.xml

重写 ListenerService 方法

ListenerService 是用于拦截发送到应用的消息并将它们传递到 C++ 库的 Java 类。当应用处于前台时(或者当应用在后台并收到仅含数据的有效负载时),消息将通过此类提供的其中一个回调传递。要向消息处理添加自定义行为,您需要继承 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 归档中,有一个声明 FCM 默认 ListenerServiceAndroidManifest.xml 文件。此清单文件通常与项目特有的清单文件合并,这样 ListenerService 才能够正常运行。这个 ListenerService 需替换为自定义的侦听器服务。为此,您可以在项目的 AndroidManifest.xml 文件中添加以下几行代码,以移除默认的 ListenerService 并添加自定义服务:

<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>

防止自动初始化

FCM 会生成一个实例 ID,并在 FCM 中将其用作注册令牌。在生成实例 ID 后,库会将标识符和配置数据上传到 Firebase。如果您想在使用实例 ID 之前能够明确地自行选择,则可以通过在配置时停用 FCM(如果是 Android,则还要停用 Analytics)来防止生成代码。为此,请向 iOS 上的 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>

iOS

FirebaseMessagingAutoInitEnabled = NO

要重新启用 FCM,您可以执行运行时调用:

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

此值一经设置,就会在应用重启后持久保存。

FCM 允许将包含深层链接的消息发送到您的应用中。要接收包含深层链接的消息,您必须为处理应用的深层链接的 Activity 添加一个新的 intent 过滤器。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 过滤器更加灵活。例如:

<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 发送下行消息和主题消息。如需了解更多信息,请参阅“快速入门”示例应用中关于此功能的演示,您可以下载、运行和查看“快速入门”示例应用。

要向您的应用添加其他更高级的行为,请参阅从应用服务器发送消息的指南:

请注意,您需要完成服务器实现才能利用这些功能。

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面