React Native应用Android 11退出状态下FCM推送失效问题排查
React Native FCM推送在Android 11后台退出状态下无法接收的问题
我的React Native应用在Android 11设备上遇到FCM推送通知问题:Android 13设备推送正常,但Android 11设备仅在应用前台或后台时能收到推送,应用退出状态下完全无法接收。
已尝试的操作
- 严格遵循Firebase官方React Native FCM集成指南
- 验证推送payload格式与结构,已包含高优先级元素
- 检查AndroidManifest.xml中的必要权限与服务
额外信息
- Firebase SDK版本:18.5.0
- React Native版本:0.72.1
Android Manifest代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustPan" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <data android:scheme="com.locom" android:host="oauthredirect" /> </intent-filter> </activity> <meta-data android:name="com.dieam.reactnativepushnotification.notification_foreground" android:value="false"/> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_fcm_notification" /> </application> </manifest>
解决方案
针对Android 11(API 30)设备应用退出后无法接收FCM推送的问题,从配置和系统限制角度,需要完成以下关键调整:
1. 补充FCM核心服务与接收器配置
你的Manifest缺少FCM后台接收推送必需的服务声明,必须在<application>标签内添加:
<!-- 自定义FCM消息处理服务 --> <service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <!-- FCM实例ID接收器 --> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="${applicationId}" /> </intent-filter> </receiver>
注:.MyFirebaseMessagingService是你需要自行创建的类,继承自FirebaseMessagingService,用于处理后台消息的接收与通知展示逻辑。
2. 添加Android 11所需的权限
Android 11对后台权限管控更严格,需在<manifest>标签内补充以下权限:
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
3. 确认推送payload的优先级与格式
确保推送使用高优先级配置,且payload结构适配Android后台接收:
- 通知消息(notification类型)需设置
priority: "high" - 数据消息(data类型)必须附带
notification字段,或者在自定义FirebaseMessagingService中主动创建通知
示例有效payload:
{ "to": "DEVICE_TOKEN", "notification": { "title": "消息标题", "body": "消息内容", "sound": "default" }, "data": { "customKey": "customValue" }, "priority": "high" }
4. 处理Android 11的电池优化限制
Android 11默认会限制后台应用的活动,需要引导用户关闭应用的电池优化:
- 在应用内添加提示,引导用户进入「设置 → 电池 → 电池优化」,将你的应用设置为「不优化」
- 可通过代码检测状态并跳转设置:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); boolean isIgnoringOptimizations = powerManager.isIgnoringBatteryOptimizations(getPackageName()); if (!isIgnoringOptimizations) { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); }
5. 升级Firebase SDK版本
你当前使用的18.5.0版本存在Android 11兼容性问题,建议升级到最新稳定版(至少20.x以上),可解决部分后台推送接收的遗留bug。
内容的提问来源于stack exchange,提问作者Osman Aziz
相关产品推荐
相关产品推荐

