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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:01:07