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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:02