向后台应用发送测试消息

开始使用 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 应用中接收消息,尝试向前台应用发送消息。

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

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

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