如何通过Firebase Cloud Messaging向Flutter应用发送定时通知
解决FCM定时发送预约提醒通知的问题
你尝试的请求里isScheduled和scheduledTime这两个字段是无效的——FCM的fcm/send API本身不支持直接设置定时发送,这些自定义参数只会被当作通知的附加数据,不会触发定时逻辑。
下面是几种可行的实现方案:
方案1:后端自建定时任务(最常用)
这是可靠性最高的方式,步骤很直接:
- 把所有需要发送的预约提醒任务存在数据库里,记录清楚目标发送时间(预约前5分钟)、FCM推送目标(令牌/主题)、通知标题和内容
- 用后端的定时任务框架,比如Java的Quartz、Python的APScheduler、Node.js的node-schedule,到点就调用FCM的
fcm/sendAPI发即时通知 - 注意处理时区问题,确保发送时间和用户所在时区匹配
举个Node.js的简单示例:
const schedule = require('node-schedule'); const axios = require('axios'); // 从数据库取出的预约任务示例 const reminderTask = { sendTime: new Date('2023-01-12T14:27:00'), // 预约前5分钟 target: '/topics/installers', notification: { title: '预约提醒', body: '距离您的预约还有5分钟,请做好准备' } }; // 定时触发发送 schedule.scheduleJob(reminderTask.sendTime, async () => { try { await axios.post('https://fcm.googleapis.com/fcm/send', { to: reminderTask.target, notification: reminderTask.notification }, { headers: { 'Authorization': 'key=你的FCM服务器密钥', 'Content-Type': 'application/json' } }); console.log('定时通知发送成功'); } catch (err) { console.error('发送失败:', err); } });
方案2:用Firebase生态工具实现
如果你的项目已经在用Firebase,可以结合Cloud Functions和Cloud Scheduler:
- 写一个Cloud Function,里面实现调用FCM发送通知的逻辑
- 用Cloud Scheduler创建定时任务,到点触发这个Cloud Function,同时传递通知的目标、内容等参数
- 这种方式不用自己维护后端服务器,适合轻量级场景
方案3:客户端本地定时(不推荐)
也可以在用户设备本地设置定时任务,到点后调用FCM客户端API发通知,但缺点很多:
- 设备必须保持开机、APP不能被系统杀死,否则定时会失效
- Android和iOS的系统定时机制行为不一致,适配成本高
- 没法统一管理所有用户的提醒,修改或取消任务很麻烦
优先推荐前两种方案,能确保通知按时、可靠地发送。
内容的提问来源于stack exchange,提问作者Deva
相关产品推荐
相关产品推荐

