获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

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

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

要使用 C++ 编写跨平台 Firebase Cloud Messaging 客户端应用程序,请使用Firebase Cloud Messaging API。 C++ SDK 适用于 Android 和 Apple 平台,每个平台都需要一些额外的设置。

设置 Firebase 和 FCM SDK

安卓

  1. 如果您还没有,请将 Firebase 添加到您的 C++ 项目中。

    • 在链接的设置说明中,查看使用 Firebase C++ SDK 的设备和应用要求,包括使用 CMake 构建应用的建议。

    • 在您的项目级build.gradle文件中,确保在您的buildscriptallprojects部分中都包含 Google 的 Maven 存储库。

  2. 创建一个Firebase App对象,传入JNI环境和Activity:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. 定义一个实现firebase::messaging::Listener接口的类。

  4. 初始化FCM,传入App和构造的Listener:

    ::firebase::messaging::Initialize(app, listener);

  5. 依赖 Google Play 服务 SDK 的应用应在访问这些功能之前检查设备是否有兼容的 Google Play 服务 APK。要了解更多信息,请参阅检查 Google Play 服务 APK

iOS+

  1. 您需要有效的APNs证书。如果您还没有,请务必在Apple Developer Member Center中创建一个。
  2. 如果您还没有,请将 Firebase 添加到您的 C++ 项目中。然后,为 FCM 设置您的项目:
    1. 在项目的 Podfile 中,添加 FCM 依赖项:
      pod 'FirebaseMessaging'
    2. firebase.frameworkfirebase_messaging.framework框架从Firebase C++ SDK拖到您的 Xcode 项目中。
  3. 配置您的 Xcode 项目以启用推送通知:

    1. 导航器区域中选择项目。
    2. 编辑器区域中选择项目目标。
    3. 编辑器区域中选择常规选项卡。

      1. 向下滚动到Linked Frameworks and Libraries ,然后单击+按钮添加框架。
      2. 在出现的窗口中,滚动到UserNotifications.framework ,单击该条目,然后单击Add

        此框架仅出现在 Xcode v8 及更高版本中,并且是此库所必需的。

    4. 编辑器区域中选择功能选项卡。

      1. 将推送通知切换到On
      2. 向下滚动到Background Modes ,然后将其切换到On
      3. 后台模式下选择远程通知
  4. 创建一个 Firebase 应用对象:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. 定义一个实现firebase::messaging::Listener接口的类。

  6. 初始化 Firebase Cloud Messaging,传入 App 和构造的 Listener:

    ::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());
    // 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);

一旦设置,此值将在应用重新启动后持续存在。

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>

当用户点击包含指向您指定的方案和主机的链接的通知时,您的应用将使用此意图过滤器启动 Activity 以处理该链接。

下一步

设置客户端应用程序后,您就可以使用 Firebase 发送下游和主题消息了。要了解更多信息,请参阅快速入门示例中演示的此功能,您可以下载、运行和查看该示例。

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

请记住,您需要一个服务器实现才能使用这些功能。