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
相关产品推荐
相关产品推荐

