You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FirebaseAdmin在C#发送FCM通知无法被Flutter安卓模拟器接收

解决Flutter Android模拟器无法接收FCM数据消息的问题

你遇到的核心问题在于FCM消息类型的差异:你的C#代码发送的是纯Data消息,但FCM控制台默认发送的是Notification消息——这两类消息在Android设备上的处理逻辑完全不同,模拟器对Data消息的接收需要额外的代码处理,而Notification消息会被系统自动展示。

问题拆解

你的代码里只设置了Data字段,属于纯Data消息:FCM不会自动把这类消息推送到系统通知栏,必须由你的Flutter应用手动监听并处理。而FCM控制台发送的是Notification消息(或混合消息),系统会直接接管并展示通知,所以模拟器能正常收到。

解决方案

1. 修改C#代码发送Notification/混合消息

如果你希望消息像控制台测试那样自动在系统托盘显示,修改SendNotification方法,添加Notification字段:

public async Task<string> SendNotification(IEnumerable<string> fcmRegistrationTokens, string title, string body)
{
    // 单设备发送用Message,多设备推荐用MulticastMessage
    Message message = new Message()
    {
        Token = "some valid token",
        // 添加Notification字段,让系统自动处理通知展示
        Notification = new Notification()
        {
            Title = title,
            Body = body,
        },
        // 保留Data字段传递自定义数据(可选)
        Data = new Dictionary<string, string>()
        {
            {"title", title},
            {"body", body},
            {"custom_key", "custom_value"}
        },
    };
    var response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
    return response;
}

如果需要给多个设备批量发送,推荐使用MulticastMessage优化性能:

var message = new MulticastMessage()
{
    Tokens = fcmRegistrationTokens.ToList(),
    Notification = new Notification() { Title = title, Body = body },
    Data = new Dictionary<string, string>() { {"custom_key", "custom_value"} }
};
var response = await FirebaseMessaging.DefaultInstance.SendMulticastAsync(message);

2. 若坚持用纯Data消息,需在Flutter端手动处理

如果业务必须用纯Data消息,必须在Flutter代码中添加监听逻辑,手动构建通知:

  • 前台消息监听:
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  if (message.data.isNotEmpty) {
    // 用flutter_local_notifications等插件手动展示通知
    _showLocalNotification(
      title: message.data['title'],
      body: message.data['body'],
    );
  }
});
  • 后台/杀死状态下的消息监听:
// 后台消息处理函数(必须是顶级函数)
Future<void> _firebaseBackgroundMessageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  if (message.data.isNotEmpty) {
    _showLocalNotification(
      title: message.data['title'],
      body: message.data['body'],
    );
  }
}

// 在main函数中注册后台处理器
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(_firebaseBackgroundMessageHandler);
  runApp(MyApp());
}

注意:后台消息处理需要配置Android的AndroidManifest.xml,确保FCM服务能正常唤醒应用。

3. 额外排查点

  • 确认模拟器安装了Google Play服务:部分Android Studio默认模拟器需要手动安装Google Play,FCM依赖该服务才能接收消息。
  • 核对令牌有效性:再次确认代码中使用的令牌和控制台测试的是同一个,避免令牌过期或拷贝错误。
  • 查看Android日志:在Android Studio的Logcat中搜索FirebaseMessaging,查看是否有消息接收的日志,帮助定位问题。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:55:14