React Native定时本地通知通知栏显示定时时间而非当前时间如何解决
本地通知显示时间错误修复方案
核心原因
通知栏默认展示的时间是系统在通知实际触发时自动赋值的当前时间,出现显示为调度时间的问题,是因为你手动给通知内容的时间字段赋值了提前计算好的「1天后的触发时间」,覆盖了系统的默认赋值逻辑。
分平台修复方案
安卓平台
- 不要给
NotificationCompat.Builder调用setWhen()时传入你预设的定时时间,要么删除手动设置setWhen的代码,让系统自动填充通知展示的当前时间;如果确实需要自定义时间显示,就在通知触发的广播接收器/Worker中实时取当前时间System.currentTimeMillis()再传给setWhen - 检查定时任务逻辑:如果用
AlarmManager实现定时,不要把调度时存入Extra的预设时间直接拿给通知使用,每次触发通知时重新拉取当前时间即可
正确/错误代码示例:
// 错误写法 val triggerTime = System.currentTimeMillis() + 24 * 60 * 60 * 1000 val notification = NotificationCompat.Builder(context, CHANNEL_ID) .setWhen(triggerTime) // 这里手动传入了未来的预设时间,触发时系统直接展示该时间,对比当前实际时间就会显示「1天前」 .build() // 正确写法 // 调度定时任务时仅配置触发逻辑,不要预设通知时间 // 广播/Worker触发通知时的代码 val notification = NotificationCompat.Builder(context, CHANNEL_ID) // 不调用setWhen,系统自动使用通知触发的当前时间 .setContentTitle("定时通知") .setContentText("你设置的通知已到达") .setSmallIcon(R.drawable.ic_notification) .build()
iOS平台
- 不要手动给
UNMutableNotificationContent的自定义字段存储的调度时间直接作为通知的显示时间,也不要将旧版UILocalNotification的fireDate赋值给通知内容的时间展示字段 - 调度通知时仅设置
UNTimeIntervalNotificationTrigger或者UNCalendarNotificationTrigger即可,通知的展示时间会由系统在触发时自动填充当前时间,无需手动设置
正确/错误代码示例:
// 错误写法 let content = UNMutableNotificationContent() content.title = "定时通知" // 手动绑定了调度时的预设时间,触发后展示该错误时间 content.userInfo["scheduledDate"] = Date().addingTimeInterval(24*60*60) // 正确写法 let content = UNMutableNotificationContent() content.title = "定时通知" content.body = "你设置的通知已到达" // 仅配置触发器,不修改通知时间的默认展示逻辑 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 24*60*60, repeats: false) let request = UNNotificationRequest(identifier: "dailyNotice", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request)
额外排查点
- 检查是否使用了自定义通知布局:如果使用自定义RemoteViews,确认你给布局里的时间控件赋值的是触发时的当前时间,而非调度时的预设时间
- 确认时区配置:如果计算1天后的时间时使用了错误的时区,会导致通知提前触发,系统显示的时间看起来就会是前一天的
内容的提问来源于stack exchange,提问作者Thisara Sudaraka
相关产品推荐
相关产品推荐

