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

如何基于Flutter+Node.js通过Firebase实现管理员与指定用户双向推送通知

Flutter+Node.js基于Firebase实现双向通知推送全流程

一、前期配置准备

  • Firebase侧配置:在Firebase控制台创建对应项目,开通Cloud Messaging服务。iOS端需上传APNs认证密钥/推送证书,否则iOS设备无法接收推送;Android端下载配置文件google-services.json,iOS端下载GoogleService-Info.plist留待客户端集成使用。
  • Flutter客户端配置:引入firebase_core、firebase_messaging、flutter_local_notifications三个核心依赖。Android端在AndroidManifest.xml中添加POST_NOTIFICATIONS权限(适配Android13及以上版本);iOS端在Info.plist中配置前台通知权限声明,同时在AppDelegate中注册FCM对应的回调代理。
  • Node.js后端配置:安装firebase-admin依赖,从Firebase控制台下载服务账号密钥文件,严禁将该密钥文件打包到客户端或上传到公开代码仓库,建议通过环境变量读取密钥配置做初始化。

Node.js端Firebase Admin初始化示例:

const admin = require('firebase-admin');
// 从环境变量读取服务账号配置,避免硬编码密钥
const serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT);
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

二、全链路核心实现逻辑

2.1 FCM设备Token统一管理

双向推送的核心是维护准确的身份-设备Token映射关系,这步做不好大概率会出现推送丢失、发错对象的问题:

  • 不管是普通用户端还是管理员端,App启动完成、Firebase初始化成功后,立刻调用FirebaseMessaging.instance.getToken()获取当前设备的FCM注册Token,将Token和当前账号的用户ID、角色标识(普通用户/管理员)绑定,调用后端接口存入数据库。
  • 全局监听FirebaseMessaging.instance.onTokenRefresh流,一旦设备Token刷新,自动调用后端接口更新数据库中对应账号的Token记录,避免Token失效导致推送失败。
  • 支持多设备登录的场景下,同一个账号要存储所有登录设备的有效Token,推送时遍历该账号下所有Token批量下发。
  • 后端增加失效Token自动清理逻辑:每次调用FCM接口推送如果返回「Token未注册/无效」的错误,直接将对应Token从数据库删除,减少无效请求。

2.2 场景1:管理员向指定用户推送通知

  • 管理员在客户端选择目标用户、填写通知标题、内容以及跳转参数(比如对应订单页、公告页路径),调用后端推送接口提交请求。
  • 后端首先校验请求发起者的身份是否具备管理员权限,校验不通过直接拒绝,避免越权推送。校验通过后从数据库查询目标用户绑定的所有有效FCM Token。
  • 后端通过Firebase Admin构造消息体,填入Token列表、通知内容、自定义data字段(存放跳转参数等业务数据),调用sendEachForMulticast()方法将消息提交给FCM服务,由FCM完成消息分发。
  • Flutter客户端分三种场景处理收到的消息:
    • App处于前台:通过onMessage流接收消息,调用flutter_local_notifications插件手动展示本地通知,用户点击通知时根据携带的参数跳转到对应页面
    • App处于后台、进程未被杀死:系统自动展示通知,用户点击通知唤醒App,从启动参数中读取自定义字段完成跳转
    • App进程完全被杀死:系统展示通知,用户点击通知冷启动App,在初始化逻辑中读取通知携带的参数完成对应跳转

Flutter端通知权限申请示例:

// iOS+Android13+ 必须先申请权限才能收到通知
NotificationSettings settings = await FirebaseMessaging.instance.requestPermission(
  alert: true,
  badge: true,
  sound: true,
);
// 配置iOS前台通知展示
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
  alert: true,
  badge: true,
  sound: true,
);

2.3 场景2:用户向管理员推送通知

  • 用户端触发需要通知管理员的业务动作(比如提交工单、发送反馈、触发风险告警)时,正常调用后端对应的业务接口即可,禁止在客户端直接集成Firebase Admin SDK发起推送,所有推送逻辑必须收敛到后端,避免密钥泄露和越权问题。
  • 后端处理完用户提交的业务逻辑后,自动触发推送流程:从数据库查询所有有效管理员账号绑定的FCM Token列表,构造消息体,将业务摘要、对应业务单ID等信息填入通知内容和data字段,提交给FCM服务分发到所有管理员设备。
  • 管理员端收到通知后的处理逻辑和普通用户端一致,用户点击通知直接跳转到对应业务处理页面(比如待审核工单详情页)。

三、关键开发注意事项

  • 权限适配必须做全:Android13及以上版本、iOS端都需要在首次启动时动态申请通知权限,用户拒绝后要做适当引导,提示用户跳转到系统设置页开启通知权限,否则无法收到推送。
  • 消息类型按需选择:FCM提供通知消息、数据消息两类,若需要自定义通知样式、前台拦截消息做业务逻辑处理,建议全部使用数据消息,由客户端自行接管通知展示逻辑,避免系统默认通知不符合业务需求。
  • 厂商系统适配:国内Android厂商普遍存在电池优化策略,App在后台被杀死后可能无法接收FCM推送,需要引导用户将App加入电池优化白名单、开启自启动权限;iOS推送测试必须使用真机,模拟器无法接收APNs转发的FCM通知。
  • 可靠性保障:后端要记录全量推送日志,包含推送时间、目标账号、Token、推送结果、错误信息,方便排查收不到通知的问题;高优先级通知可以增加2-3次重试逻辑,遇到FCM服务临时超时、网络错误时自动重试。
  • 安全红线不能碰:Firebase服务账号密钥仅能存放在后端,绝对不能泄露到客户端;所有推送接口必须加身份鉴权,普通用户账号不能调用面向其他用户的推送接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:24:12