向后台应用发送测试消息

开始使用 FCM 时,您可以构建一个最简单的用例:当应用在设备后台运行时,通过 Notifications Composer 向开发设备发送一条测试通知消息。本页面列出了实现上述目标所需执行的步骤,包括从设置到验证的所有步骤。如果您已针对 FCM 设置了 Flutter 应用,您可能已经完成了本页面中的一些步骤。

安装 FCM 插件

  1. 安装并初始化适用于 Flutter 的 Firebase SDK(如果您尚未这样做)。

  2. 从 Flutter 项目的根目录运行以下命令,以安装该插件:

    flutter pub add firebase_messaging
    
  3. 完成后,重新构建您的 Flutter 应用:

    flutter run
    

获取注册令牌

如需将消息发送到特定的设备,您需要知道该设备的注册令牌。您需要在 Notifications 控制台的相应字段中输入该令牌才能完成本教程,因此请确保在获得令牌后即复制该令牌或将其妥善存储。

如需检索应用实例的当前注册令牌,请调用 getToken()。如果未授予通知权限,此方法将向用户请求通知权限。在其他情况下,它会返回一个令牌,或由于出现错误而拒绝该 Future。

final fcmToken = await FirebaseMessaging.instance.getToken();

发送测试通知消息

  1. 在目标设备上安装并运行该应用。在 Apple 设备上,您需要接受权限请求,才能收到远程通知。

  2. 确保应用在设备的后台运行。

  3. 在 Firebase 控制台中,打开“Messaging”(消息功能)页面

  4. 如果这是您的第一条消息,请选择制作首个宣传活动

    1. 选择 Firebase 通知消息,然后选择创建
  5. 否则,请在宣传活动标签页上选择新建宣传活动,然后选择通知

  6. 输入消息内容。所有其他字段都是选填字段。

  7. 从右侧窗格中选择发送测试消息

  8. 在标签为添加 FCM 注册令牌的字段中,输入您根据本指南的前一部分获得的注册令牌。

  9. 选择测试

在您选择测试后,目标客户端设备(在后台中运行应用)应该会接收到通知。

如需详细了解发送到您应用的消息,请参阅 FCM 报告信息中心。该信息中心记录在 Apple 和 Android 设备上发送和打开的消息数量,以及 Android 应用的“展示次数”(用户看到的通知条数)数据。

处理交互

当用户点按通知时,Android 和 iOS 上的默认行为均是打开应用。也就是说,如果应用当前是终止状态,系统便会启动应用;如果应用在后台运行,系统则会将其转至前台。

根据通知的具体内容,您可能会希望在应用打开时便处理用户与通知的交互。例如,如果系统使用通知发送了新的聊天消息并且用户选择了该消息,那么您可能会希望应用在打开时便同时打开具体对话内容。

firebase-messaging 软件包提供了两种方式来处理此类交互:

  1. getInitialMessage():如果应用在打开之前处于终止状态,则此方法会返回一个包含 RemoteMessageFuture,并且系统会在用户使用该 RemoteMessage 之后将其移除。
  2. onMessageOpenedApp:如果应用在打开之前处于后台状态,则系统会通过一个 Stream 来发布 RemoteMessage

为了确保用户获得顺畅的体验,您应该处理这两种情况。以下代码示例简单展示了实现上述操作的方法:

class Application extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _Application();
}

class _Application extends State<Application> {
  // In this example, suppose that all messages contain a data field with the key 'type'.
  Future<void> setupInteractedMessage() async {
    // Get any messages which caused the application to open from
    // a terminated state.
    RemoteMessage? initialMessage =
        await FirebaseMessaging.instance.getInitialMessage();

    // If the message also contains a data property with a "type" of "chat",
    // navigate to a chat screen
    if (initialMessage != null) {
      _handleMessage(initialMessage);
    }

    // Also handle any interaction when the app is in the background via a
    // Stream listener
    FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
  }

  void _handleMessage(RemoteMessage message) {
    if (message.data['type'] == 'chat') {
      Navigator.pushNamed(context, '/chat',
        arguments: ChatArguments(message),
      );
    }
  }

  @override
  void initState() {
    super.initState();

    // Run code required to handle interacted messages in an async function
    // as initState() must not be async
    setupInteractedMessage();
  }

  @override
  Widget build(BuildContext context) {
    return Text("...");
  }
}

具体使用哪一种交互处理方式取决于您的应用设置。上面的示例展示了一个使用 StatefulWidget 的基本示例。

后续步骤

向前台应用发送消息

向在后台运行的应用成功发送通知消息后,您可参阅在 Flutter 应用中接收消息,尝试向前台应用发送消息。

除通知消息之外的其他功能

如需向您的应用添加其他更高级的行为,您需要服务器实现

然后,在您的应用客户端中: