React Native应用在杀死/退出状态下打开通知崩溃(Android11及以上)
Firebase getInitialNotification() 在Android 11+崩溃/失效的解决方案
核心原因
Android 11(API 30)及以上版本对后台启动权限、PendingIntent 行为、系统通知管控做了更严格的限制,旧版本Firebase SDK未适配这些变更,导致getInitialNotification()无法正常触发甚至引发崩溃。
具体解决步骤
1. 升级Firebase SDK到最新稳定版
旧版本Firebase Messaging SDK可能未适配Android 11+的系统规则,优先更新依赖:
- 原生Android(build.gradle):
dependencies { // 可通过Firebase官网确认最新稳定版 implementation 'com.google.firebase:firebase-messaging:23.4.1' implementation 'com.google.firebase:firebase-core:21.1.1' } - React Native(package.json):
{ "dependencies": { "@react-native-firebase/messaging": "^18.7.0", "@react-native-firebase/app": "^18.7.0" } }
更新后同步项目并清理构建缓存。
2. 修正PendingIntent的Flag配置
Android 11+要求PendingIntent必须明确设置FLAG_IMMUTABLE或FLAG_MUTABLE,单独使用旧的FLAG_UPDATE_CURRENT会导致异常:
- 原生创建通知时:
val intent = Intent(this, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK putExtra("notification_data", remoteMessage.data) } val pendingIntent = PendingIntent.getActivity( this, 0, intent, // 无需修改Intent内容用IMMUTABLE,需要修改则用MUTABLE PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) - React Native场景下,若自定义通知渠道,需确保原生端的PendingIntent配置符合上述要求。
3. 适配Android 11+的后台启动限制
Android 11+禁止后台应用直接启动Activity,需确保通知触发的启动行为合规:
- 推送消息时使用Firebase的
notification字段(而非仅data字段),让系统负责创建通知,确保启动行为被系统允许; - 避免在
getInitialNotification()回调中执行耗时操作或直接启动多页面,应先启动主Activity,再在主Activity的onCreate中处理通知数据; - 确保通知渠道优先级设为
IMPORTANCE_HIGH,保证通知能正常唤起应用。
4. 完善通知渠道配置(Android 8+)
Android 11+对通知渠道有效性检查更严格,必须正确创建并使用渠道:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channelId = "your_notification_channel_id" val channel = NotificationChannel( channelId, "推送通知", NotificationManager.IMPORTANCE_HIGH ).apply { description = "接收Firebase推送通知" enableVibration(true) setShowBadge(true) } val notificationManager = getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) }
发送通知时必须指定该渠道ID,否则Android 11+上通知可能无法正常显示。
5. 调试捕获异常
在getInitialNotification()回调中添加异常捕获,定位具体崩溃原因:
- React Native示例:
import messaging from '@react-native-firebase/messaging'; messaging().getInitialNotification() .then(remoteMessage => { if (remoteMessage) { console.log('从杀死状态启动的通知数据:', remoteMessage); // 处理通知逻辑 } }) .catch(error => { console.error('getInitialNotification异常:', error); console.error(error.stack); }); - 原生Android可在
FirebaseMessagingService的onMessageReceived和相关代码中添加try-catch,查看Logcat的崩溃日志。
6. 检查AndroidManifest配置
确保FirebaseMessagingService注册正确,主Activity的launchMode不冲突:
<!-- 注册Firebase消息服务 --> <service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- 主Activity配置,避免singleInstance/singleTask导致启动异常 --> <activity android:name=".MainActivity" android:launchMode="standard"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
内容的提问来源于stack exchange,提问作者Praveen Ajayan
相关产品推荐
相关产品推荐

