如何基于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,在初始化逻辑中读取通知携带的参数完成对应跳转
- 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
相关产品推荐
相关产品推荐

