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
该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页面之间的通信时机上。
关键问题分析:
- 插件调用时机过早:
fireGlobalEvent可能在uni-app页面的globalEvent.addEventListener监听器注册之前就被触发了,导致事件被错过。 - 插件环境差异:
uni.requireNativePlugin("globalEvent")获取的插件对象与plus.globalEvent可能不是同一个实例,且事件机制可能不同。
解决方案:
方案一:确保监听先于触发
在uni-app页面的 onLoad 或 onReady 生命周期中尽早注册事件监听器:
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);
});
}

