Ionic5 Android12/13后台Firebase推送通知异常问题求助
Ionic 5 项目 Android 12/13 后台无法接收 Firebase 推送的解决方案
核心原因
Android 12(API 31)及以上系统收紧了后台启动限制和通知权限申请逻辑,同时 Firebase Messaging(FCM)的后台推送接收依赖特定的服务配置与权限声明,旧版本的适配配置在新系统下不再生效。
具体解决步骤
1. 更新 Firebase 相关插件依赖
确保项目中使用的 FCM 插件版本适配 Android 12+:
- 若使用 Cordova 插件:
cordova plugin remove cordova-plugin-firebase-messaging cordova plugin add cordova-plugin-firebase-messaging@latest - 若使用 Capacitor 插件:
npm install @capacitor-firebase/messaging@latest npx cap sync android
2. 调整 AndroidManifest.xml 配置
在 platforms/android/app/src/main/AndroidManifest.xml 中补充以下配置:
- 声明 Android 13+ 必需的通知权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> - 为 Firebase 消息服务添加
android:exported="true"属性(Android 12+ 要求组件必须显式声明导出状态):<service android:name="com.google.firebase.messaging.FirebaseMessagingService" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 可选:添加后台唤醒相关权限,提升 FCM 连接稳定性:
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
3. 动态申请通知权限(Android 13+)
在 Ionic 启动逻辑中主动请求通知权限,否则后台推送无法正常展示:
import { Platform } from '@ionic/angular'; import { FirebaseMessaging } from '@capacitor-firebase/messaging'; // 对应所用插件的API async requestNotificationPermission() { if (this.platform.is('android') && parseInt(this.platform.version().number) >= 13) { const permissionResult = await FirebaseMessaging.requestPermissions(); if (permissionResult.receive === 'granted') { // 权限授予成功,可继续执行FCM注册逻辑 } } }
若使用 Cordova 插件,对应 API 为 firebase.messaging.requestPermission()。
4. 调整 FCM 消息推送格式
后台状态下,仅数据消息会触发应用内的 onMessageReceived 回调,通知消息由系统直接处理(权限未授予时不会显示)。推送 payload 需按数据消息格式构造:
{ "data": { "title": "新通知", "body": "后台可接收的数据消息内容", "click_action": "FCM_PLUGIN_ACTIVITY" }, "to": "<目标设备令牌>" }
5. 替换弃用的 FCM 服务组件
Android 12+ 中 FirebaseInstanceIdService 已被弃用,需改用 FirebaseMessagingService 的 onNewToken 方法获取设备令牌:
public class CustomFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String token) { super.onNewToken(token); // 处理新生成的设备令牌 } @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); // 处理后台收到的推送消息 } }
关键配置说明
- Android 12+ 组件导出规则:所有四大组件(Activity、Service、Receiver、Provider)必须显式声明
android:exported属性,值为true或false。 - Android 13 通知权限:
POST_NOTIFICATIONS为运行时权限,必须动态申请,默认状态下未授予。 - FCM 消息类型区分:通知消息由系统后台处理,数据消息需应用自行处理逻辑,后台状态下仅数据消息能触发应用内回调。
内容的提问来源于stack exchange,提问作者harshal ionic
相关产品推荐
相关产品推荐

