如何在Expo开发的React Native应用中实现每日推送不同内容的定时通知
解决方案
你当前使用的单次重复触发通知只能绑定固定内容,无法直接实现每日动态内容切换,可根据你的业务场景选择以下3种可行方案:
方案1:本地预批量调度(适合通知内容提前存储在本地数组/本地数据库、通知总周期可控的场景)
提前将未来N天的通知一次性调度完成,每条通知对应当天的独立内容,不需要设置重复属性:
- 预先整理或从本地存储读取所有通知内容:
// 示例内容数组,也可从AsyncStorage/本地SQLite读取 const dailyReminders = [ { title: "今日提醒", body: "记得补充1500ml水分" }, { title: "今日提醒", body: "今日运动量建议达到30分钟" }, // 更多内容 ]
- 批量调度未来N天的通知,调度前先清空旧通知避免重复:
import * as Notifications from 'expo-notifications'; import { addDays } from 'date-fns'; // 日期处理工具,也可手动计算日期 // 清空已有的旧调度 await Notifications.cancelAllScheduledNotificationsAsync(); // 调度未来30天的通知,可根据需求调整天数,注意不要超过Expo最多64条调度的限制 for (let i = 0; i < 30; i++) { const triggerDate = addDays(new Date(), i); triggerDate.setHours(12, 30, 0, 0); // 过滤掉已经过去的当日时间,从下一个有效时间开始调度 if (triggerDate < new Date()) continue; // 取对应日期的内容,内容不足时可循环取数组内容 const dayContent = dailyReminders[i % dailyReminders.length]; await Notifications.scheduleNotificationAsync({ content: dayContent, trigger: triggerDate // 传入具体日期对象,不需要设置repeats属性 }); }
- 优化补充:每次用户打开App时重新执行一次调度逻辑,补充后续天数的通知,避免预设天数用完后无通知推送。
方案2:触发后动态调度下一次通知(适合内容需要实时生成、不想提前批量调度的场景)
利用Expo的通知接收事件钩子,当天的通知推送完成后,立刻拉取新内容调度第二天的通知:
- 首次启动App时先调度第一天的通知
- 注册通知接收监听器,触发后自动调度下一次:
Notifications.addNotificationReceivedListener(async (notification) => { // 过滤非每日提醒类的通知,可通过自定义data字段做类型标记 if (notification.request.content.data?.type !== 'daily_reminder') return; // 从本地数据库/接口拉取下一天的提醒内容 const nextContent = await fetchNextDayReminder(); // 计算下一天的12:30触发时间 const nextTrigger = addDays(new Date(), 1); nextTrigger.setHours(12, 30, 0, 0); // 调度下一次通知 await Notifications.scheduleNotificationAsync({ content: { ...nextContent, data: { type: 'daily_reminder' } }, trigger: nextTrigger }); });
注意:该方案存在限制:如果用户长期不打开App、或杀死App进程,监听器无法触发可能导致通知断更,仅适合通知优先级不高的场景。
方案3:服务端推送(适合内容存储在后端、用户量较大的场景)
如果你的应用有后端服务,最稳定的方案是不用客户端做本地调度,直接通过Expo推送服务由服务端触发:
- 客户端仅需要获取Expo Push Token上传到后端存储
- 后端设置定时任务,每日12:30从数据库拉取当日推送内容,批量给所有目标用户推送通知即可,内容可完全动态控制,不受客户端状态影响。
内容的提问来源于stack exchange,提问作者isaac
相关产品推荐
相关产品推荐

