React Native本地通知:每日定时提醒实现及失效问题排查
实现每日重复的本地通知,用react-native-push-notification库就能搞定,核心步骤如下:
安装配置库
按照官方指引完成iOS和Android的基础配置:Android要在AndroidManifest.xml加权限,iOS得开启推送权限并配置通知相关设置。初始化通知服务
App启动时先初始化PushNotification,同时创建Android专属的通知渠道(高优先级保证通知能正常弹出):import PushNotification, { Importance } from 'react-native-push-notification'; PushNotification.configure({ onRegister: (token) => console.log('TOKEN:', token), onNotification: (notification) => { console.log('NOTIFICATION:', notification); notification.finish(PushNotificationIOS.FetchResult.NoData); }, permissions: { alert: true, badge: true, sound: true }, popInitialNotification: true, requestPermissions: true, }); // 创建Android通知渠道 PushNotification.createChannel( { channelId: 'daily_reminder', channelName: '每日提醒', channelDescription: '每日早8点通知', importance: Importance.HIGH, vibrate: true, }, (created) => console.log(`渠道创建状态:${created}`), );设置每日8点重复通知
计算首次触发时间,若当前已过8点就设为第二天的8点,再开启每日重复:const setDaily8AMReminder = () => { const now = new Date(); let scheduleTime = new Date( now.getFullYear(), now.getMonth(), now.getDate(), 8, 0, 0, ); // 若当前时间已过8点,调整为第二天的8点 if (now.getTime() >= scheduleTime.getTime()) { scheduleTime.setDate(scheduleTime.getDate() + 1); } PushNotification.localNotificationSchedule({ title: '每日提醒', message: '该查看今日内容啦!', date: scheduleTime, allowWhileIdle: true, // 适配Android休眠模式 channelId: 'daily_reminder', repeatType: 'day', // 开启每日重复 importance: Importance.HIGH, }); }; // App启动时调用该方法 setDaily8AMReminder();
针对你提供的代码,通知仅生效3天就停了,常见问题和修复方向如下:
安卓电池优化拦截
小米、华为、OPPO等国产厂商的电池优化会清理后台非活跃应用的定时任务,3天后应用被判定为非活跃,通知就被拦截了。
解决:引导用户把应用加入电池优化白名单,或者在Android原生代码中申请忽略电池优化权限:// 在MainActivity中添加 Intent intent = new Intent(); String packageName = getPackageName(); PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); if (!pm.isIgnoringBatteryOptimizations(packageName)) { intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + packageName)); startActivity(intent); }重复通知逻辑漏洞
你的代码只在当前时间早于8:10时才设置通知,如果App在8:10之后启动,不会触发当天的通知,且后续重复任务依赖首次设置的时间。若App长时间未启动,重复逻辑可能中断。
解决:不管当前时间是否过了8:10,都重新计算下一次触发时间(过了就设为第二天的8:10),确保每次App启动都能重置或更新定时任务。通知渠道未正确配置
你用了channelId: 'local',但如果这个渠道没提前创建,或者渠道优先级不够,会被系统拦截通知。
解决:初始化时调用PushNotification.createChannel创建local渠道,且把importance设为Importance.HIGH。库版本兼容性问题
react-native-push-notification旧版本在Android 12+上可能存在重复通知失效的bug。
解决:升级库到最新稳定版,同时适配Android 12+的通知权限和渠道要求。系统清理后台任务
内存不足时,系统会清除非活跃应用的后台定时任务。
解决:搭配react-native-background-fetch这类后台任务库,定期唤醒App并重新设置通知,保证定时任务不被清除。iOS后台限制
iOS对后台定时任务限制严格,repeatType: 'day'在App被杀死后可能无法稳定触发。
解决:iOS推荐用UNCalendarNotificationTrigger(可以通过react-native-notifications库或原生代码实现),它的重复触发可靠性更高,同时引导用户开启应用的“后台刷新”权限。
内容的提问来源于stack exchange,提问作者user19476497

