You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:04