Cordova FCMplugin安卓构建后无法接收前台推送问题求助
排查Cordova+AngularJS中FCM插件前台推送失效的问题
我之前也碰到过类似的诡异问题,给你几个实际可行的排查方向和解决方案:
1. 检查构建时插件钩子的执行完整性
这个FCM插件依赖Cordova钩子脚本在构建时自动修改AndroidManifest.xml和相关服务配置。修改应用内容后重新构建,有时候钩子会因为缓存或构建流程异常没跑完全,导致FCM的核心服务/广播接收器配置丢失。
- 手动打开
platforms/android/app/src/main/AndroidManifest.xml,检查是否存在以下FCM相关配置:<service android:name="com.gae.scaffolder.plugin.MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name="com.gae.scaffolder.plugin.MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> - 如果配置缺失,说明钩子执行失败,可以尝试在
config.xml中确认插件的钩子声明是否存在,或者手动执行插件的钩子脚本。
2. 确认AngularJS中回调的注册时机
重新构建后,AngularJS的初始化流程可能因为代码变更出现时序问题,导致onNotification回调注册晚于FCM插件的初始化,消息送达时回调还未绑定。
- 务必确保所有FCM相关逻辑都在
deviceready事件触发后执行,比如:document.addEventListener("deviceready", function(){ // 先注册推送回调 FCMPlugin.onNotification(function(data){ if(data.wasTapped){ // 后台点击推送的逻辑 } else { // 前台接收推送的逻辑 } }); // 再获取推送令牌 FCMPlugin.getToken(function(token){ console.log("设备令牌:", token); }); }, false); - 同时检查是否有新引入的代码覆盖了
onNotification回调,或者存在异步初始化冲突。
3. 彻底清理Cordova构建缓存
Cordova的构建缓存经常会残留旧配置,尤其是多次构建后,这是这类“时好时坏”问题的常见根源。
- 执行以下命令彻底清理后重新构建:
cordova clean android rm -rf platforms/android rm -rf plugins/com.gae.scaffolder.plugin.fcm rm package-lock.json npm install cordova plugin add cordova-plugin-fcm cordova build android - 这个流程能确保所有依赖、配置都是全新的,避免缓存导致的配置不一致。
4. 查看Android设备日志定位错误
用adb logcat工具过滤FCM相关日志,关键词可以用FirebaseMessaging、MyFirebaseMessagingService,看看有没有报错信息——比如广播接收器未找到、服务注册失败、消息接收被拦截等,日志会直接告诉你问题出在哪。
5. 验证Firebase控制台配置一致性
虽然首次构建正常,但如果重新构建时修改了应用签名或包名(哪怕是无意中的),都会导致Firebase控制台的推送无法正确匹配到应用。
- 确认Firebase控制台中安卓应用的包名、签名证书SHA-1值,和当前构建的应用完全一致。
我之前是通过彻底清理构建缓存+检查钩子执行解决的问题,你可以逐个尝试这些方法,应该能定位到根源。
内容的提问来源于stack exchange,提问作者OngoBoingo
相关产品推荐
相关产品推荐

