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

如何设置Firebase定时通知?实现用户自定义时间推送

实现指定时间推送通知的方案(基于Firebase Cloud Messaging)

核心思路

要实现用户指定时间的通知推送,需结合FCM(Firebase Cloud Messaging)负责通知下发,搭配定时任务服务触发推送动作——既可以用Firebase自带的Cloud Functions定时触发器,也能在自定义后端通过定时库实现。

具体步骤

1. 基础配置Firebase

  • 注册Firebase项目,在控制台添加对应平台(Android/iOS/Web)的应用,获取配置文件(如google-services.json、GoogleService-Info.plist)并集成到客户端,确保客户端能正常接收FCM通知。
  • 在Firebase控制台获取服务器密钥(用于后端调用FCM API),同时客户端集成后要获取用户设备的FCM令牌,将其存储到数据库用于定向推送。

2. 实现定时推送逻辑

方案一:Firebase Cloud Functions定时触发

适合无自定义后端的场景,直接在Firebase部署定时函数:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

// 示例:每天上午10点推送,可修改cron表达式适配任意时间
exports.scheduledNotification = functions.pubsub.schedule("0 10 * * *")
  .timeZone("Asia/Shanghai")
  .onRun(async (context) => {
    // 从数据库获取目标用户的FCM令牌
    const targetTokens = ["用户设备令牌1", "用户设备令牌2"];
    const notificationPayload = {
      notification: {
        title: "定时提醒",
        body: "这是你设置的指定时间通知"
      }
    };
    // 调用FCM发送通知
    await admin.messaging().sendToDevice(targetTokens, notificationPayload);
    return null;
  });
方案二:自定义后端+定时库

如果已有自主后端服务,可使用node-schedule这类定时库触发推送:

const schedule = require('node-schedule');
const axios = require('axios');

// 示例:在2024年5月20日14:30触发推送
const pushJob = schedule.scheduleJob(new Date(2024, 4, 20, 14, 30), async () => {
  const fcmApi = 'https://fcm.googleapis.com/fcm/send';
  const requestHeaders = {
    'Authorization': 'key=你的Firebase服务器密钥',
    'Content-Type': 'application/json'
  };
  const pushData = {
    to: '目标用户的FCM令牌',
    notification: {
      title: "定时提醒",
      body: "这是你设置的指定时间通知"
    }
  };
  await axios.post(fcmApi, pushData, { headers: requestHeaders });
});

3. 支持用户自定义时间

如果允许用户自主设置通知时间,需先将用户设置的时间、设备令牌、通知内容存储到数据库(如Firebase Firestore),再通过定时任务定期检查待推送的任务:

exports.checkPendingNotifications = functions.pubsub.schedule("* * * * *") // 每分钟检查一次
  .timeZone("Asia/Shanghai")
  .onRun(async (context) => {
    const currentTime = new Date();
    // 查询数据库中已到发送时间且未推送的任务
    const pendingTasks = await admin.firestore().collection('user_scheduled_notifications')
      .where('sendTime', '<=', currentTime)
      .where('isSent', '==', false)
      .get();
    
    const updateBatch = admin.firestore().batch();
    for (const taskDoc of pendingTasks.docs) {
      const taskData = taskDoc.data();
      // 发送通知
      await admin.messaging().sendToDevice(taskData.token, taskData.payload);
      // 标记任务为已推送
      updateBatch.update(taskDoc.ref, { isSent: true });
    }
    await updateBatch.commit();
    return null;
  });

注意事项

  • FCM令牌可能随应用卸载、设备重置更新,需客户端定期同步最新令牌到数据库。
  • 定时任务的时区必须配置正确,避免推送时间偏差。
  • 服务器密钥属于敏感信息,自定义后端需妥善保管,避免泄露。
  • 测试时可设置短间隔的定时任务(如1分钟后),快速验证推送流程是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:20:30