uniapp无法接受globalEvent

uniapp无法接受globalEvent

开发环境 版本号 项目创建方式
Mac 12.7.6 HBuilderX

操作步骤:

插件代码

DCUniSDKInstance * instance = self.uniInstance;  
//传送到vue页面的参数  
NSDictionary * params =  @{@"num": @"211"};  

[instance fireGlobalEvent:@"eventName" params:params];

uniapp代码

var globalEvent = uni.requireNativePlugin("globalEvent");  
globalEvent.addEventListener('eventName', (e)=>{  
    console.log("Plugin已经被监听到了");                 
});  
plus.globalEvent.addEventListener('eventName', (e)=>{    
    console.log("plus已经被监听到了");                   
});

### 预期结果:


打印 Plugin已经被监听到了 和 plus已经被监听到了

实际结果:

没有任何反应


### bug描述:


uniapp无法接受globalEvent

2 回复

该bug反馈内容基本完整但存在关键缺失:标题和描述简洁但未明确区分uni-app与uni-app x项目类型;代码示例完整可直接运行;复现步骤缺少原生代码集成方式说明(如是否通过自定义插件);分类信息提供了版本和平台但未说明项目类型(uni-app或uni-app x)。预期结果合理,但实际结果"无反应"需结合平台特性分析。
经核查知识库,发现核心问题:globalEvent模块主要用于nvue与vue页面间通信,而非原生与vue直接通信。文档明确标注"vue向nvue通讯(已过期,推荐使用uni.$on、uni.$emit)"。用户混淆了通信场景:

原生(iOS)向vue通信应使用plus.webview.postMessageToUniNView(需指定nvueId)
或改用uni.postMessage/uni.onMessage标准API
plus.globalEvent在uni-app x中已被废弃,且用户HBuilderX 4.87版本已启用JSVM子线程机制,可能影响旧API行为

此非真实bug而是概念误用:用户试图用nvue专用通信模块实现原生-vue通信。建议改用uni.postMessage方案,并确认项目类型(若为uni-app x则需完全避免plus API)。反馈中未说明是否使用nvue页面,属关键信息缺失导致误报。 内容为 AI 生成,仅供参考


根据你提供的代码,问题可能出在插件与uni-app页面之间的通信时机上。

关键问题分析:

  1. 插件调用时机过早fireGlobalEvent 可能在uni-app页面的 globalEvent.addEventListener 监听器注册之前就被触发了,导致事件被错过。
  2. 插件环境差异uni.requireNativePlugin("globalEvent") 获取的插件对象与 plus.globalEvent 可能不是同一个实例,且事件机制可能不同。

解决方案:

方案一:确保监听先于触发 在uni-app页面的 onLoadonReady 生命周期中尽早注册事件监听器:

onLoad() {
  var globalEvent = uni.requireNativePlugin("globalEvent");
  globalEvent.addEventListener('eventName', (e) => {
    console.log("Plugin已经被监听到了", e);
  });
  plus.globalEvent.addEventListener('eventName', (e) => {
    console.log("plus已经被监听到了", e);
  });
}

方案二:使用uni.$emit和uni.$on进行页面间通信 如果事件是在uni-app内部组件或页面间传递,推荐使用uni-app自带的全局事件总线:

发送事件:

uni.$emit('eventName', { num: '211' });

接收事件:

onLoad() {
  uni.$on('eventName', (e) => {
    console.log("接收到事件", e);
  });
}
回到顶部