Angular8 Cordova打包移动端APP获取Firebase Token失败事件不触发求助
问题解决方案
解决Cannot redefine property: BetterJsPop报错
该报错由Zone.js全局属性拦截逻辑和第三方类库的属性定义冲突导致,Zone.js会拦截全局defineProperty操作,而BetterJsPop相关代码尝试重复定义同一个不可配置的属性,可按如下步骤修复:
- 在
src/polyfills.ts文件中,import 'zone.js/dist/zone'代码之前添加如下配置,让Zone.js忽略对BetterJsPop属性的拦截:
(window as any).__Zone_ignore_on_properties = [ { target: window, ignoreProperties: ['BetterJsPop'] } ]; // 可顺便添加该行避免popstate事件被重复拦截引发的返回键异常 (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['popstate'];
- 不要在构造函数中手动调用
deviceReady方法:deviceready是Cordova专属的原生加载完成事件,构造函数执行时Cordova还未完成初始化,手动调用会直接触发插件不存在的异常,你已经通过@HostListener绑定了事件触发逻辑,无需额外手动调用。
解决Firebase Token获取失败、事件不触发问题
- 首先确认你已正确安装Cordova专属的Firebase消息推送插件,执行
cordova plugin ls检查是否存在cordova-plugin-firebase-messaging,如果没有需先安装该插件,安装时要传入你从Firebase控制台下载的google-services.json(安卓端)和GoogleService-Info.plist(iOS端)对应的路径参数。 - 你当前package.json中同时安装了Web版的
@firebase/messaging、firebase依赖,会和Cordova原生插件产生冲突,先执行npm uninstall @firebase/messaging firebase移除这两个依赖,Cordova Firebase插件已经内置了原生端的Firebase逻辑,无需重复引入Web版SDK。 - 给FCM相关操作添加错误捕获,排查具体异常原因,修改代码如下:
@HostListener("document:deviceready", []) async deviceReady() { console.log('DeviceID',this.uuid); this.user.DeviceID = this.uuid; const fcm = (window as any).cordova?.plugins?.firebase?.messaging; if(!fcm) { console.error('FCM插件未加载,请检查Cordova插件安装情况'); return; } // 监听前台消息 fcm.onMessage((payload) => { console.log('Angular New foreground FCM message: ', payload); try { window.alert('You have a new notificaion'); } catch (Exception) { console.log("error",Exception.message); } }); // 监听后台消息 fcm.onBackgroundMessage((payload) => { console.log('Angular New background FCM message: ', payload); }); // 申请权限+获取token,添加错误捕获 try { await fcm.requestPermission(); const token = await fcm.getToken(); console.log('Angular Got device token: ', token); this.user.userToken = token; console.log('Token = :' + token); } catch (e) { console.error('FCM操作失败', e); } return true; }
- 安卓13及以上版本需要动态申请通知权限,如果你使用的Cordova Firebase Messaging插件版本过低请升级到兼容安卓13的版本,同时确认应用的通知权限已经手动开启。
- 检查Firebase控制台填写的包名是否和你Cordova项目的包名完全一致,包名不匹配无法生成有效Token。
内容的提问来源于stack exchange,提问作者Ezzat
相关产品推荐
相关产品推荐

