使用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
相关产品推荐
相关产品推荐

