当前位置: 首页 > news >正文

HarmonyOS中,html 与 ets 桥接沟通

流程解释

需要先初始化webview.WebMessagePort,然后一个ets使用,发送一个端口给html去用。
来个视频展示一下效果(文件有点大,1.8M,估计要载入一会儿):

这里的流程蛮有意思的,画个图解释一下。

ets端

// ... const HARMONY_PORT = 0; const HTML_PORT = 1; // ... export default struct AppWebViewPage { // ... build() { Web({ src: this.url, controller: this.webviewController, }) .onPageEnd(() => { try { this.ports = this.webviewController.createWebMessagePorts() || []; // 这里会返回2个端口。 // 有点类似于 实例化了一个网页和鸿蒙之间发送消息的管道,然后把管道的两个头作为端口返回回来 // 所以这里就有有2个端口,也就是这个通信管道的2个头 // 那么 // 1. 使用 HARMONY_PORT 端口,作为鸿蒙的端口,用来发送和接收消息 // 2. 使用 HTML_PORT 端口,作为html的端口,把这个端口通过 HARMONY_PORT 端口发给html,让html来使用。 if (!this.ports || this.ports.length < 2) { hilog.error(1, 'Error', '创建端口失败:返回端口数量不足'); return; } /* 端口0, 给鸿蒙端使用 */ this.ports[HARMONY_PORT].onMessageEvent((result: webview.WebMessage) => { this.onMessageEvent(result); }); /* 端口1, 发送给html进行使用 */ this.webviewController.postMessage('__init__project__', [this.ports[HTML_PORT]], '*'); } catch (e) { hilog.error(1, 'Error', '初始化 WebMessagePort 失败:' + JSON.stringify(e)); } }) } /** * 接收到H5消息 * @param result */ private onMessageEvent(result: webview.WebMessage) { let msg = ''; try { msg = result.toString() || ''; hilog.info(1, 'INFO', 'onMessageEvent:' + msg); } catch (e) { hilog.error(1, 'Error', '获取消息字符串失败:' + JSON.stringify(e)); return; } } /** * 向H5发布消息 * @param message */ public sendMessageToH5(message: string) { hilog.info(1, 'INFO', 'sendMessageToH5:' + message); try { this.ports[HARMONY_PORT].postMessageEvent(message); } catch (error) { hilog.error(1, 'Error', '向H5发布消息失败:' + JSON.stringify(error)); } } }

html 端

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Harmony H5 Demo</title> </head> <body> <h1>H5 Page</h1> <button onclick="sendMsgToEts()">发送消息到鸿蒙侧</button> <h2>日志记录</h2> <pre id="logHistory"></pre> <script> let messagePort = null; function appendLog(message) { const logHistory = document.getElementById("logHistory"); const logLine = new Date().toLocaleTimeString() + " - " + message; logHistory.textContent = logHistory.textContent ? logLine + "\n" + logHistory.textContent : logLine; } appendLog("页面已初始化,等待鸿蒙侧端口..."); window.addEventListener("message", function (event) { if (event.data === "__init__project__" && event.ports && event.ports.length > 0) { messagePort = event.ports[0]; if (typeof messagePort.start === "function") { messagePort.start(); } console.log("H5 Port initialized"); appendLog("端口初始化成功"); messagePort.onmessage = function (portEvent) { appendLog("收到鸿蒙侧消息: " + portEvent.data); }; } }); function sendMsgToEts() { if (messagePort) { const obj = { name: "我是html的来的消息,发给鸿蒙的", value: 123 }; messagePort.postMessage(JSON.stringify(obj)); } else { console.error("messagePort is null, Please initialize first"); appendLog("发送失败: messagePort is null, Please initialize first"); } } </script> </body> </html>
http://www.jsqmd.com/news/1093647/

相关文章:

  • LangGraph 工作流:从工具接入到项目提效
  • 读论文:IoTGA-SRC²,如何让遗传算法更懂 deadline?
  • 2026最新八字排盘app评测:命枢与天乙八字排盘功能矩阵和使用边界观察
  • 解决 Kiran Session Guard 常见问题:用户指南与故障排除技巧
  • Ludusavi 终极指南:游戏存档备份与恢复的完整解决方案
  • SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(4)算法篇(DrQ vs VICE)
  • YOLO 分类器与路径安全:当 AI 自己判断风险等级
  • 高效能烤盘定制厂家找哪家
  • 打工人用 Codex / Claude Code 偷懒:我把这几样重复杂活交给了命令行 AI
  • 终极指南:3步免费解决广色域显示器色彩过饱和问题
  • STL缩略图生成技术深度解析:Windows Shell扩展与3D渲染实现
  • witty-profiler Python实现详解:从安装配置到高级用法的完整指南
  • 慕课助手终极指南:3大核心功能让你的在线学习效率翻倍 [特殊字符]
  • 如何永久保存微信聊天记录?这款免费工具让你真正拥有数据主权
  • 十大护眼台灯品牌排行榜:整理公认好用的护眼灯,学习更护眼舒适
  • 7大场景揭秘:为什么iTransformer是时间序列预测的最佳选择?
  • JMeter CSV数据驱动测试实战:从参数化到并发场景详解
  • AI相关术语及开发技术路线详解
  • 企业级Agent的工程化部署:从概念验证到生产环境 2026落地实战指南与架构方案
  • 电影《给阿嬷的情书》:一封跨越半世纪的情书,如何教会企业数字定位?
  • 2026年零基础做量化,先把交易想法写成条件动作
  • Prompt已死,Loop崛起!硅谷大佬纷纷看好,循环工程成代码生成新趋势
  • 多模态代码智能兴起:美团等团队梳理任务瓶颈,提出4大未来研究方向
  • 为什么世界要有意义?
  • 园区网络多业务安全隔离一步到位
  • 机器人测试避坑指南:Windows 还是 Ubuntu?
  • 4月亮相的StanbyMe 2 Max电视美国开售,32英寸续航4.5小时,屏幕可横竖旋转
  • 软件设计师 1 个月快速备考完整方案
  • APP开发4个月上线月入18万?成都创业者的实战复盘
  • 2026手机免费生成无水印证件照,醒图、美图秀秀App完整操作指南