Asp.Net Core Firebase API通知异常:线上API发送成功但浏览器未接收
问题排查与解决方案
1. 先查推送Payload的格式
Firebase控制台发通知会自动补全标准字段,但自己写API如果漏了关键字段,浏览器可能直接丢了不显示。Web Push必须带这些核心内容:
var message = new Message() { Token = token, Notification = new Notification() { Title = title, Body = messageContent, // Chrome这类浏览器必须要Icon,不然可能不弹通知 Icon = "https://你的线上域名.com/icon.png", // 可选但建议加点击跳转,不然通知点了没反应 ClickAction = "https://你的线上域名.com" }, // 线上环境浏览器容易节流高优先级通知,必须设这个 Webpush = new WebpushConfig() { Headers = new Dictionary<string, string>() { {"Urgency", "high"} } } };
去看看你NotificationsManager.SendPushNotifications里是不是没加Icon或者Urgency,这是最常见的坑。
2. 验证Firebase SDK的线上配置
- 确认线上用的服务账号密钥是对的,而且这个账号有
Cloud Messaging Admin权限,别用本地测试的密钥凑数。 - 检查线上服务器能不能访问
https://fcm.googleapis.com/,有些云服务商的防火墙会拦这个域名,得加白名单。 - 初始化SDK的代码别硬编码本地路径,比如:
var builder = new FirebaseAppBuilder(); builder.SetCredential(FirebaseCredential.FromFile("线上环境正确的密钥路径")); builder.SetDatabaseUrl("https://你的项目ID.firebaseio.com/"); FirebaseApp.Create(builder.Build());
3. 前端Service Worker要检查
- 线上环境的
firebase-messaging-sw.js得能正常访问,打开浏览器控制台看注册状态,别返回404。 - 看看SW里的消息处理逻辑有没有问题,比如是不是没调用
showNotification:
messaging.onMessage((payload) => { console.log('收到消息: ', payload); const notificationTitle = payload.notification.title; const notificationOptions = { body: payload.notification.body, icon: payload.notification.icon, data: payload.data }; return self.registration.showNotification(notificationTitle, notificationOptions); });
注意线上必须用HTTPS,SW路径别写错,跨域也会导致收不到。
4. 去Firebase控制台查消息日志
在Firebase控制台的Cloud Messaging -> Reports -> Message Insights里,用接口返回的MessageId搜那条消息,看详细状态:
- 是不是标记为"已送达"?
- 有没有失败原因,比如Token无效?(虽然你说控制台能用同一Token,但还是确认下)
5. 确认发送的Token和控制台用的完全一致
别想当然认为数据库里的Token是对的,线上环境可能因为部署问题,Token被覆盖或者读错了。在接口里加个日志,把要发送的Token打出来,和控制台用的对比,确保完全一样。
6. 用最简代码测试
暂时把SendPushNotifications换成最简版,排除复杂逻辑的干扰:
public static async Task<BatchResponse> SendPushNotifications(string message, string title, List<string> tokens) { var messaging = FirebaseMessaging.DefaultInstance; var messages = tokens.Select(token => new Message() { Token = token, Notification = new Notification() { Title = title, Body = message, Icon = "https://你的线上域名.com/favicon.ico" // 换成你自己的图标地址 }, Webpush = new WebpushConfig() { Headers = new Dictionary<string, string> { {"Urgency", "high"} } } }).ToList(); return await messaging.SendAllAsync(messages); }
如果最简版能收到,说明原来的NotificationsManager里有逻辑问题,比如payload加了多余参数导致被拦截。
内容的提问来源于stack exchange,提问作者Shahreyar Butt
相关产品推荐
相关产品推荐

