如何设置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
相关产品推荐
相关产品推荐

