FCM onNotification在APP未激活时点击通知不触发问题求助
解决Cordova FCM插件后台点击通知时
onNotification不触发的问题 针对你遇到的「APP后台接收通知正常,但点击通知打开APP时onNotification处理器无响应,前台则正常触发」的问题,结合你的配置和代码细节,给你几个实用的排查和修复方向:
1. 确认click_action与AndroidManifest的匹配性
你在Payload中设置了click_action":"FCM_PLUGIN_ACTIVITY",这个值需要和Android项目的AndroidManifest.xml中的Activity配置完全对应:
- 检查Manifest里是否声明了
FCM_PLUGIN_ACTIVITY,并且添加了android:exported="true"(Android 12及以上版本强制要求):<activity android:name="FCM_PLUGIN_ACTIVITY" android:exported="true" android:launchMode="singleTop"> <intent-filter> <action android:name="FCM_PLUGIN_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> - 如果你的APP主Activity已经是
singleTop或singleTask模式,也可以把click_action改成主Activity的完整类名(比如com.yourcompany.yourapp.MainActivity),有时候这种方式比依赖插件默认的FCM_PLUGIN_ACTIVITY更稳定。
2. 统一并升级Firebase依赖版本
你手动指定的11.4.2版本比较老旧,这类早期版本存在后台通知点击事件传递的已知bug。建议:
- 升级到较新的稳定版本(比如19.0.0系列,避免直接跳转到最新版本引发兼容性问题)
- 确保所有Firebase和Google Play服务的版本完全一致,包括
firebase-core、firebase-messaging、play-services-auth、play-services-identity - 避免手动修改插件的gradle文件后被
cordova prepare覆盖,可以用Cordova钩子脚本自动注入依赖配置,或者直接安装适配目标版本的插件版本。
3. 确保插件初始化时机正确
你的onNotification订阅代码要放在Cordova平台就绪之后执行,否则可能错过后台点击的事件监听。调整代码到platform.ready()的回调中:
import { Platform } from '@ionic/angular'; import { FCM } from '@ionic-native/fcm/ngx'; @Component({ selector: 'app-root', templateUrl: 'app.component.html' }) export class AppComponent { constructor( private platform: Platform, private fcm: FCM ) { this.initializeApp(); } initializeApp() { this.platform.ready().then(() => { // 平台就绪后再订阅通知事件 this.fcm.onNotification().subscribe(data => { console.log('通知数据:', JSON.stringify(data)); if(data.wasTapped){ console.log('后台点击通知触发:', JSON.stringify(data)); // 这里可以添加你的跳转逻辑 } else { console.log('前台接收通知'); } }); }); } }
4. 调整Payload的消息结构
当Payload同时包含notification和data字段时,Android后台状态下系统会接管通知展示,点击时的data参数传递可能受系统限制。可以尝试两种调整方式:
- 完全使用
data消息:把notification里的内容移到data字段中,这种情况下无论前台后台,onNotification都会被触发,你可以在代码中自行处理通知弹窗:{ "to": "YOUR_DEVICE_TOKEN", "data": { "title": "Message", "body": "From XXX", "sound": "default", "notificationKey": "XXX", "goto": "messageForBidder", "evid": "XXX", "id": "XXX" }, "click_action": "FCM_PLUGIN_ACTIVITY" } - 保留
notification但补充content_available:在Payload中添加"content_available": true,确保后台状态下APP能唤醒处理事件。
5. 检查插件修改是否被覆盖
你手动修改了FCMPlugin.gradle和project.properties,但每次执行cordova prepare android时,插件的原始配置文件可能会覆盖你的修改。建议:
- 使用Cordova的
after_prepare钩子脚本,自动修改gradle配置 - 或者安装指定版本的
cordova-plugin-fcm-with-dependency-updated插件,确保插件默认依赖版本符合你的需求
内容的提问来源于stack exchange,提问作者Apeksha
相关产品推荐
相关产品推荐

