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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:00:49