如何在React Native/Expo中实现每年重复的生日提醒本地通知?
问题解决方案
1. 实现每年指定日期重复的生日提醒(YearlyTriggerInput 正确用法)
你之前用repeats: true配合时间间隔触发,会导致通知按固定秒数循环,这是因为用了基于时间间隔的触发器,而非年度日期触发器。要实现每年指定日期(如3月1日6点)重复,需直接使用YearlyTriggerInput配置触发器:
代码示例
import * as Notifications from 'expo-notifications'; async function scheduleYearlyBirthdayAlert() { // 先请求通知权限(首次调用必须执行) const { status } = await Notifications.requestPermissionsAsync(); if (status !== 'granted') { console.log('通知权限未授权'); return; } await Notifications.scheduleNotificationAsync({ content: { title: '生日提醒', body: '今天是TA的生日,记得送祝福!', }, trigger: { // 核心:配置年度触发器参数 month: 3, // 月份从1开始,3代表3月 day: 1, hour: 6, minute: 0, repeats: true, // 开启年度重复 timeZone: 'Asia/Shanghai', // 必须设置时区,避免跨时区时间偏差 // year 留空或设为undefined,表示每年重复触发 }, }); }
关键注意点
month参数范围是1-12,对应1月到12月;day要选目标月份的有效日期(比如2月不能设30)。- 务必设置
timeZone:不指定的话会用设备默认时区,可能导致通知在非预期时间触发。 - 闰年处理:如果生日是2月29日,可额外判断年份,非闰年时将触发日期设为2月28日或3月1日。
2. vibrate 设置[0,500]不生效的解决方法
[0,500]的振动模式不生效,通常是平台兼容性或配置问题,可按以下步骤排查:
步骤1:确认振动权限配置
在app.json中添加Android振动权限(iOS无需额外配置):
{ "expo": { "android": { "permissions": ["VIBRATE"] } } }
步骤2:调整振动模式格式
部分平台(如iOS)不支持以0开头的振动数组,建议修改为非0起始的模式,或使用Expo提供的预设振动模式:
await Notifications.scheduleNotificationAsync({ content: { title: '生日提醒', body: '今天是TA的生日!', // 方案1:调整为非0起始的振动数组 vibrate: [200, 500], // 方案2:使用预设振动模式 // vibrate: Notifications.VibrationPatterns.Default, }, // 触发器配置同上 });
步骤3:设备侧检查
- 确保设备振动功能正常,未开启"静音模式"(部分设备静音会禁用振动)。
- iOS对振动模式的长度有严格限制,建议保持数组长度在4个元素以内;Android支持更复杂的模式。
内容的提问来源于stack exchange,提问作者Bimal Pandey
相关产品推荐
相关产品推荐

