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

如何使用Firebase Cloud Messaging在指定日期时间发送推送通知

FCM 定时推送实现方案

FCM 本身没有提供原生的定时推送接口,你可以结合 Node 生态的工具实现需求,以下是三种常用的落地方案:

方案1:Node 服务本地定时任务

适合推送量小、单节点服务稳定运行的场景,依赖 node-schedule 库实现:

  • 先安装依赖:npm install node-schedule
  • 示例代码:
const schedule = require('node-schedule');
const admin = require('firebase-admin');
// 你的 Firebase Admin 初始化逻辑保持不变,此处省略

const sendChristmasNotify = () => {
  const registrationToken = '目标设备的 registrationToken';
  const message = {
    notification: {
      title: '圣诞快乐',
      body: '你的圣诞专属福利已送达'
    }
  };
  const notify_options = { priority: 'high' };

  admin.messaging().sendToDevice(registrationToken, message, notify_options)
    .then(res => console.log('推送成功', res))
    .catch(err => console.error('推送失败', err));
};

// 定时规则:2024年12月25日0点0分触发,注意替换为你需要的年份
// * 注意:node-schedule 月份参数为0索引,12月对应值为11
const christmasJob = schedule.scheduleJob('0 0 0 25 11 *', sendChristmasNotify);
  • 注意事项:该方案依赖 Node 服务持续在线,服务重启会丢失未触发的任务,需要自行将待执行的定时任务存在数据库中,服务重启时扫描未执行的任务重新注册。

方案2:Firebase 云函数定时触发器

如果你已经在使用 Firebase 生态,直接用云函数的定时触发器即可,无需自行维护任务状态:

  • 示例代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.sendChristmasPush = functions.pubsub.schedule('0 0 25 12 *')
  .timeZone('Asia/Shanghai') // 替换为你需要的时区
  .onRun(() => {
    const message = {
      notification: {
        title: '圣诞快乐',
        body: '你的圣诞专属福利已送达'
      },
      // 如果是全量推送可以直接用主题,不需要遍历设备token
      topic: 'allUsers'
    };
    return admin.messaging().send(message);
  });
  • 优势:任务触发由 Firebase 官方保证可用性,不需要处理服务重启导致的任务丢失问题,适合面向大量用户的定时推送场景。

方案3:持久化任务队列实现

如果你的服务是集群部署、推送量级较大,推荐用带持久化能力的任务队列实现:

  • 用 BullMQ + Redis 实现延迟任务,创建任务时指定延迟到12月25日的时间戳,队列会自动在指定时间触发推送逻辑
  • 自带失败重试、去重执行、任务持久化能力,适配集群部署场景,不会出现任务重复推送或者丢失的问题

内容的提问来源于stack exchange,提问作者warCommander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:45:07