Firestore云函数实现向指定设备推送FCM通知的问题
实现Pub/Sub调度云函数精准推送通知到目标用户设备
核心思路是:先在数据库中维护用户与FCM推送令牌的关联关系,调度函数触发时先查询满足条件的目标用户,再提取对应令牌执行推送。以下是具体修改步骤和代码示例:
1. 确认用户-FCM令牌的存储结构
假设你用Firestore存储用户数据,每个用户文档(比如users/{userId})需要包含:
- 用于判断推送条件的业务字段(比如
taskDueSoon: boolean) - 用户设备的FCM令牌字段(比如
fcmToken: string)
2. 修改调度云函数代码
结合你提供的文档触发推送逻辑,把调度函数的流程调整为:触发后查询满足条件的用户集合,遍历用户并逐个提取FCM令牌执行推送。
原待完善调度函数(示例)
exports.scheduledNotification = functions.pubsub.schedule('every 1 minutes').onRun(async (context) => { // TODO: 查询满足条件的用户,推送通知 console.log('Scheduled function ran'); return null; });
修改后的调度函数
const admin = require('firebase-admin'); admin.initializeApp(); exports.scheduledNotification = functions.pubsub.schedule('every 1 minutes').onRun(async (context) => { // 1. 查询满足推送条件的用户(示例:查询taskDueSoon为true的用户) const usersSnapshot = await admin.firestore().collection('users').where('taskDueSoon', '==', true).get(); if (usersSnapshot.empty) { console.log('No users need notifications'); return null; } // 2. 遍历用户,逐个推送通知 const promises = []; usersSnapshot.forEach(doc => { const userData = doc.data(); const fcmToken = userData.fcmToken; if (!fcmToken) { console.log(`User ${doc.id} has no FCM token`); return; } // 3. 复用你文档触发推送的通知构造逻辑 const message = { notification: { title: '任务提醒', body: '你的任务即将到期,请及时处理' }, token: fcmToken }; // 加入推送任务队列 promises.push(admin.messaging().send(message)); }); // 等待所有推送完成 await Promise.all(promises); console.log(`Sent notifications to ${promises.length} users`); return null; });
3. 关键注意事项
- 确保FCM令牌是用户在Flutter端通过
firebase_messaging插件获取并上传到数据库的,比如用户登录或设备注册时更新令牌 - 推送前要检查令牌是否有效,避免无效令牌导致的推送失败
- 可以批量处理推送,但注意FCM的发送限制,避免触发频率限制
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

