如何在Flutter应用中Firebase字段变更时给用户推通知(含应用关闭场景)
实现方案总览
要实现该功能,核心依赖Firebase的后端触发能力+系统级推送能力,不需要应用保持前台运行也能正常触达用户,整体分为4个核心步骤:
步骤1:客户端集成FCM获取设备推送令牌
- 首先在Flutter项目的
pubspec.yaml中添加firebase_messaging依赖,完成Firebase基础配置 - 用户首次启动应用时主动申请通知权限,权限通过后调用
FirebaseMessaging.instance.getToken()获取当前设备的唯一FCM令牌 - 将该令牌与当前用户的UID绑定,存储到Firebase数据库(Cloud Firestore/Realtime Database均可)对应的用户文档中,推荐字段名为
fcmToken
注意:用户更换设备、卸载重装应用都会导致FCM令牌变更,需要监听令牌更新事件,及时同步数据库中的令牌值
步骤2:配置Cloud Functions监听数据库变更
- 编写Firebase Cloud Functions触发器,监听目标用户字段所属的文档路径
- 触发器触发后对比字段变更前后的数值,确认是预期的变更事件后,从用户文档中取出提前存储的
fcmToken - 按照FCM规范构造通知payload,包含通知标题、正文,可选添加自定义数据字段用于后续点击跳转逻辑
如果同一用户绑定了多台设备,可以存储多个FCM令牌,触发时遍历所有令牌批量发送即可
示例Cloud Functions代码片段(Node.js环境):
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 示例监听Firestore的users集合下用户文档的targetField字段变更 exports.sendNotifyOnFieldUpdate = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { const beforeVal = change.before.data().targetField; const afterVal = change.after.data().targetField; // 字段未变更直接终止执行 if (beforeVal === afterVal) return null; // 取用户FCM令牌 const fcmToken = change.after.data().fcmToken; // 构造通知内容 const payload = { notification: { title: "字段更新提醒", body: `你关注的字段已更新为${afterVal}` }, data: { "updateField": "targetField", "value": afterVal.toString() } }; // 发送通知 return admin.messaging().sendToDevice(fcmToken, payload); });
如果使用的是Firebase Realtime Database,只需把触发器替换为
functions.database.ref('/users/{userId}').onUpdate()即可,业务逻辑完全一致
步骤3:配置客户端后台/杀死状态下的通知接收逻辑
- Android端需要在
AndroidManifest.xml中配置FCM默认通知渠道,确保应用已申请通知权限 - iOS端需要在Xcode中开启Push Notifications、Background Modes下的Remote notifications权限,同时在Firebase控制台配置APNs认证信息
- 完成
firebase_messaging集成后,应用处于后台或完全关闭状态时,FCM通知会自动被系统展示在通知栏,不需要额外编写后台保活代码 - 如果需要实现用户点击通知跳转到应用内指定页面的逻辑,可以监听
FirebaseMessaging.onMessageOpenedApp、调用FirebaseMessaging.instance.getInitialMessage()处理不同场景的通知点击事件
步骤4:部署测试
- 将编写完成的Cloud Functions部署到Firebase云端
- 手动修改数据库中对应用户的目标字段值,分别测试应用在前台、后台、完全关闭三种状态下的通知接收情况
注意:iOS模拟器不支持接收推送通知,需要使用真机测试
内容的提问来源于stack exchange,提问作者mo sal
相关产品推荐
相关产品推荐

