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

@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;
}

排查顺序建议

  1. 确认AppDelegate中通知代理方法的正确性
  2. 检查RN侧监听器注册/移除逻辑
  3. 排除通知参数干扰
  4. 验证react-native-splash-screen的初始化时机冲突

内容的提问来源于stack exchange,提问作者Aubri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:14:57