@react-native-community/push-notification-ios的localNotification事件未触发
本地通知监听器未触发问题排查与解决方案
核心问题分析
本地通知可成功发送,但localNotification事件监听器未触发,结合你怀疑react-native-splash-screen的影响,从以下关键环节逐一排查:
排查步骤与解决方案
1. 修正AppDelegate配置(核心)
react-native-splash-screen的初始化可能干扰通知回调传递,需确保通知代理方法正确实现且优先级合理:
AppDelegate.mm 关键代码调整
#import <React/RCTPushNotificationManager.h> #import "RNSplashScreen.h" @interface AppDelegate () <UNUserNotificationCenterDelegate> @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 其他初始化代码... // 先设置通知代理,确保回调链路优先初始化 UNUserNotificationCenter.currentNotificationCenter.delegate = self; // 启动闪屏页,避免阻塞通知回调 [RNSplashScreen show]; return YES; } // 前台收到通知时的回调(必须实现,否则RN监听器收不到事件) - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { // 通知RN侧处理事件 [RCTPushNotificationManager didReceiveNotification:notification]; // 根据需求设置展示选项,比如允许声音/横幅 completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBanner); } // 后台点击通知时的回调 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { [RCTPushNotificationManager didReceiveNotificationResponse:response]; completionHandler(); } @end
关键注意点:
- 必须设置
UNUserNotificationCenter.currentNotificationCenter.delegate = self,否则通知回调不会触发 willPresentNotification中必须调用[RCTPushNotificationManager didReceiveNotification:notification],确保事件传递到RN侧- 闪屏页初始化不要阻塞主线程,保证通知回调正常执行
2. 优化RN侧监听器逻辑
你的useEffect注册时机没问题,但可优化监听器的移除逻辑并增加调试信息:
useEffect(() => { console.log('uef'); const handleLocalNotification = (notification: PushNotificationIOS) => { console.log('로컬 노티 왔어요~~', notification.getAlert()); }; PushNotificationIOS.addEventListener('localNotification', handleLocalNotification); return () => { // 传入对应处理函数,精准移除监听器 PushNotificationIOS.removeEventListener('localNotification', handleLocalNotification); }; }, []);
3. 排除通知参数干扰
你设置了isSilent: true,虽不影响监听器触发,但可临时注释该参数测试:
PushNotificationIOS.addNotificationRequest({ id: 'asdfdf', title: 'dasdf', isCritical: true, // isSilent: true, 暂时注释 body: '일어나야지~~', fireDate: date, });
4. 排查react-native-splash-screen冲突
若上述步骤无效,尝试延迟初始化闪屏页,避免与通知代理初始化冲突:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 其他初始化代码... UNUserNotificationCenter.currentNotificationCenter.delegate = self; // 延迟100ms启动闪屏页,确保通知链路初始化完成 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [RNSplashScreen show]; }); return YES; }
排查顺序建议
- 确认AppDelegate中通知代理方法的正确性
- 检查RN侧监听器注册/移除逻辑
- 排除通知参数干扰
- 验证react-native-splash-screen的初始化时机冲突
内容的提问来源于stack exchange,提问作者Aubri
相关产品推荐
相关产品推荐

