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

React Native Android前后台推送通知onNotification未触发问题求助

我之前处理过类似ExpoKit搭配react-native-push-notification的推送问题,给你几个实用的排查和修复方向:

1. 检查MainApplication.java的初始化逻辑

由于你用的是ExpoKit,一定要注意推送库的初始化时机,必须放在Expo的初始化之后,否则会因为生命周期冲突导致通知无法被捕获:

  • 确认在getPackages()方法中正确添加了new PushNotificationPackage()
  • 在onCreate()方法里,按顺序执行初始化:
@Override
public void onCreate() {
  super.onCreate();
  SoLoader.init(this, /* native exopackage */ false);
  // 先完成Expo的初始化,再初始化推送
  PushNotificationManager.initialize(this, false);
}

另外,如果你的应用集成了FCM,要避免自定义的FirebaseMessagingService覆盖掉推送库的监听服务,最好让自定义服务继承自RNPushNotificationListenerService。

2. 验证AndroidManifest.xml的配置完整性

推送库需要特定的权限和组件配置,缺一项都可能导致onNotification不触发:

  • 确保添加了必要的权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
  • 检查receiver和service的配置,保证路径正确且没有被Expo的组件覆盖:
<receiver
    android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.USER_PRESENT" />
    </intent-filter>
</receiver>
<service
    android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>

你可以通过Android Studio的「Build -> Analyze APK」查看合并后的Manifest,确认这些组件是否被正确保留。

3. 解决ExpoKit与第三方推送的冲突

ExpoKit自带了推送服务,很容易和react-native-push-notification产生冲突:

  • 尝试在app.json中禁用Expo自带的推送功能,添加配置:"push": false
  • 检查是否Expo的ExpoPushTokenManager或相关服务已经注册,导致第三方库无法接收通知事件。
4. 调整推送消息的格式

FCM对前台和后台通知的格式要求不同,这是很多人踩坑的点:

  • 如果应用在后台或被杀死状态,推送消息必须包含notification字段才能触发系统通知栏显示,进而被onNotification捕获。测试时可以用如下格式的payload:
{
  "to": "你的设备TOKEN",
  "notification": {
    "title": "测试通知",
    "body": "这是一条测试推送"
  },
  "data": {
    "customData": "自定义内容"
  }
}

如果只有data字段,后台状态下需要自己处理显示逻辑,否则不会触发onNotification。

5. 确认库版本与RN 0.49的兼容性

RN 0.49是比较旧的版本,react-native-push-notification的新版本可能不再支持它。建议安装3.x系列的库版本(比如3.1.3),这个版本和RN 0.49兼容性较好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:42:34