如何在不使用Google Functions的情况下实现Firebase Firestore变更通知?
无计费情况下实现Firestore数据变更跨应用通知的方案
方案1:管理员应用端轮询Firestore
- 核心思路:管理员应用定期查询Firestore中新增的请求数据,对比本地记录的最后查询标记,发现新数据就触发通知。
- 实现步骤:
- 在管理员应用中维护本地变量(比如
lastCheckedTime或lastRequestId),记录上次查询到的最新请求的时间戳或ID。 - 用
setInterval设置定时任务(比如每30秒执行一次),调用Firestore查询接口,筛选出createdAt大于lastCheckedTime的请求数据。 - 若查询到新数据,更新本地标记,并通过浏览器
Notification API触发桌面通知。
- 在管理员应用中维护本地变量(比如
- 注意事项:
- 根据业务需求调整轮询频率,非高峰时段可拉长间隔,避免资源浪费。
- 用Firestore的
where+orderBy优化查询,只获取新增数据,减少传输量。 - 浏览器后台会限制定时器频率,确保应用在前台或允许后台活动时运行。
方案2:管理员应用前台实时监听Firestore
- 核心思路:管理员应用在前台运行时,直接监听请求集合的实时变更,无需Service Worker。
- 实现步骤:
- 初始化Firestore后,给请求集合添加
snapshotListener:const requestsRef = db.collection('requests'); const unsubscribe = requestsRef.onSnapshot((snapshot) => { snapshot.docChanges().forEach((change) => { if (change.type === 'added') { if (Notification.permission === 'granted') { new Notification('新请求通知', { body: `收到新请求:${change.doc.data().title}` }); } } }); }); - 应用切换到后台时取消监听,回到前台再恢复,避免无效连接消耗。
- 初始化Firestore后,给请求集合添加
- 注意事项:
- 首次监听会获取所有现有数据,可通过
isNotified标记过滤已处理请求,通知后更新该字段。 - 依赖前台连接,适合管理员经常保持应用在前台的场景。
- 首次监听会获取所有现有数据,可通过
方案3:结合Firebase实时数据库同步触发
- 核心思路:用户应用提交请求后,同步向实时数据库写入临时记录,管理员应用监听该节点变更触发通知。
- 实现步骤:
- 用户应用提交Firestore请求后,向实时数据库
newRequests节点写入临时数据(含请求ID和基本信息)。 - 管理员应用监听
newRequests的child_added事件:const dbRef = firebase.database().ref('newRequests'); dbRef.on('child_added', (snapshot) => { const requestData = snapshot.val(); if (Notification.permission === 'granted') { new Notification('新请求提醒', { body: `请求ID:${requestData.id},内容:${requestData.content}` }); } // 通知后删除临时记录,避免重复触发 snapshot.ref.remove(); });
- 用户应用提交Firestore请求后,向实时数据库
- 注意事项:实时数据库免费额度足够支撑小量请求,比轮询Firestore更高效。
通用前置操作
无论采用哪种方案,都需要先在管理员应用中申请通知权限:
if (Notification.permission !== 'granted') { Notification.requestPermission().then(permission => { if (permission === 'granted') { console.log('通知权限已获取'); } }); }
内容的提问来源于stack exchange,提问作者Alias
相关产品推荐
相关产品推荐

