在 HarmonyOS 上实现 ArkTS 与 H5 的交互

本文介绍了如何在H5页面通过JSBridge与HarmonyOS应用进行交互,以获取通讯录为例,详细讲解了环境搭建、代码结构、JSBridge的实现和H5调用原生侧功能的过程。

介绍

本篇 Codelab 主要介绍 H5 如何调用原生侧相关功能,并在回调中获取执行结果。以“获取通讯录”为示例分步讲解 JSBridge 桥接的实现。

相关概念

Web组件:提供具有网页显示能力的 Web 组件。

@ohos.web.webview:提供 web 控制能力。

完整示例

gitee源码地址

源码下载

ArkTS与H5的交互(ArkTS).zip

环境搭建

我们首先需要完成 HarmonyOS 开发环境搭建,可参照如下步骤进行。

软件要求

DevEco Studio版本:DevEco Studio 3.1 Release。 

HarmonyOS SDK版本:API version 9。

硬件要求

设备类型:华为手机或运行在 DevEco Studio 上的华为手机设备模拟器。

HarmonyOS 系统:3.1.0 Developer Release。

环境搭建

安装 DevEco Studio,详情请参考下载和安装软件

设置 DevEco Studio 开发环境,DevEco Studio 开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:如果可以直接访问 Internet,只需进行下载HarmonyOS SDK操作。

如果网络不能直接访问 Internet,需要通过代理服务器才可以访问,请参考配置开发环境

开发者可以参考以下链接,完成设备调试的相关配置:使用真机进行调试

使用模拟器进行调试

代码结构解读

本篇 Codelab 只对核心代码进行讲解,对于完整代码,我们会在源码下载或 gitee 中提供。

├──entry/src/main/ets              // 代码区	        │  ├──common                       // 公共代码区│  │  ├──constants                 // 公共常量│  │  │  ├──CodeConstant.ets       // 异步脚本模板│  │  │  └──CommonConstant.ets     // 公共常量和样式常量│  │  └──utils                     // 工具类│  │     ├──JsBridge.ets           // 桥接类│  │     └──Logger.ets             // 日志类│  ├──entryability                 │  │  └──EntryAbility.ets          // 程序入口│  ├──pages│  │  └──SelectContact.ets         // 主页面│  └──viewmodel                    // 项目所需数据类型定义│     ├──JavaScriptItem.ets        // javaScriptProxy数据格式│     └──ParamsItem.ets	           // 回调参数数据格式└──entry/src/main/resources        // 资源入口(rawfile文件夹中存放html)   └──rawfile      ├──js                    │  └──mainPage.js            // H5调用函数文件      ├──css      │  └──main.css               // H5样式文件      └──MainPage.html             // H5页面

ArkTS 侧与 H5 的交互

1.  首先在开发 H5 页面(输入框和金额选择部分)前需要实现 JSBridge 桥接打通两侧的交互。开发者可以在 ArkTS 侧定义一个 JSBridge 类,在类中封装 call 方法以及 initJsBridge 方法。

2.  准备异步执行脚本,在脚本中声明一个 JSBridgeMap、JSBridgeCallback 方法与 ohosCallNative 对象。并通过 runJavaScript 在 H5 端注册 ohosCallNative。

3.  通过 Web 组件的 javaScriptProxy 属性将 ArkTS 侧的 call 方法以及 JSBridgeHandle 注册到 H5。H5 侧调用 ohosCallNative 对象中的 callNative 方法,传递 func、params 以及 callback 回调。在 callNative 中保存 callback 回调。并调用 JSBridgeHandle 的 call 方法。

4.ArkTS 侧执行完毕。最后调用 runJavaScript 方法执行 callback,H5 侧接收异步回调数据。

4.1 初始化 JSBridge

在 initJSBridge 方法中,通过 webviewControll.runJavaScript()将 JSBridge 初始化脚本注入 H5 执行。其中 callID 用来标识 H5 回调;JSBridgeCallback 方法用来执行 H5 侧回调;window.ohosCallNative 对象给 H5 侧提供调用函数。

// CodeConstant.ets
/** * 异步执行脚本*/export const code = `  const JSBridgeMap = {};  let callID = 0;    // 执行H5回调函数  function JSBridgeCallback (id, params) {    JSBridgeMap[id](params);    JSBridgeMap[id] = null;    delete JSBridgeMap[id];  }
  // 在window中声明callNative方法供H5调用  window.ohosCallNative = {    callNative(method, params, callback) {      const id = callID++;      const paramsObj = {          callID: id,          data: params || null      }      JSBridgeMap[id] = callback || (() => {});      JSBridgeHandle.call(method, JSON.stringify(paramsObj));    }  }`;

4.2 javaScriptProxy 注入

通过 Web 组件的 javaScriptProxy 属性,将 JSBridgeHandle 对象注册到 H5 侧的 window 上,作为 H5 调用原生的通道。

// JsBridge.etsexport default class JsBridge {  /**   * 注入JavaScript对象到window对象中     *   * @returns javaScriptProxy object   */  get javaScriptProxy(): JavaScriptItem {    return {      object: {        call: this.call      },      name: "JSBridgeHandle",      methodList: ['call'],      controller: this.controller    } as JavaScriptItem;  }}
// SelectContact.ets@Entry@Componentstruct SelectContact {  webController: WebView.WebviewController = new WebView.WebviewController();  private jsBridge: JSBridge = new JSBridge(this.webController);
  build() {    Column() {      Web({        src: $rawfile('MainPage.html'),        controller: this.webController      })        .javaScriptAccess(true)        .javaScriptProxy(this.jsBridge.javaScriptProxy)        ...    }    ...  }}

4.3 call 方法及 callback 回调

call 方法作为 H5 调用原生侧接口的统一入口,在该方法中根据 H5 调用的方法名,匹配到对应的接口后调用,调用结束后通过 this.callback()方法,将调用结果回传到 H5。

// JsBridge.ets/** * 定义桥接类 */export default class JsBridge {  /**   * 将ArkTS侧数据传递给call方法   */  call = (func: string, params: string): void => {    const paramsObject: ParamsItem = JSON.parse(params);    switch (func) {      case 'chooseContact':        result = this.chooseContact();        break;      default:        break;    }    result.then((data: string) => {      this.callback(paramsObject?.callID, data);    })  }
  /**   * 将ArkTS侧数据传递到H5   */  callback = (id: number, data: string): void => {    this.controller.runJavaScript(`JSBridgeCallback("${id}", ${JSON.stringify(data)})`);  }}

4.4 H5 调用 ArkTS

实现了上述桥接逻辑后,在 H5 侧只需要调用 ohosCallNative 方法,将函数名以及回调函数传递到 ArkTS。

// mainPage.jsfunction chooseContact() {  window.ohosCallNative.callNative('chooseContact', {}, (data) => {    ...  });}

总结

您已经完成了本次 Codelab 的学习,并了解到以下知识点:

1.  ArkTS 侧如何使用桥接通道提供给 H5 调用方法。

2.  H5 如何接收 ArkTS 侧的异步数据。

<think>我们正在讨论HarmonyOSArkTSH5交互方式。根据提供的引用,我们可以总结出以下关键点:1.**ArkTS调用H5方法**:通过Web组件的`runJavaScript()`方法执行H5侧的JavaScript代码。 2. **H5调用ArkTS方法**:通过`registerJavaScriptProxy()`方法将ArkTS对象注册到H5侧,然后H5可以直接调用该对象的方法。 具体步骤:### ArkTS调用H5JavaScript函数在ArkTS中,使用Web组件的`runJavaScript()`方法可以执行H5页面中的JavaScript函数。例如,在页面加载完成后(如`onPageEnd`事件中)调用H5的函数。示例代码(ArkTS):```typescript@Entry@Componentstruct WebComponent {controller: WebviewController= newWebviewController();build() {Column() {Web({ src: $rawfile("index.html"),controller:this.controller}).javaScriptAccess(true).onPageEnd(()=> {//调用H5中的函数this.controller.runJavaScript('window.myH5Function("Hellofrom ArkTS")');})}}} ```### H5调用ArkTS方法1.**在ArkTS中注册一个对象**:使用`registerJavaScriptProxy()`方法将一个ArkTS对象注册到H5的`window`对象上,这样H5就可以通过这个对象调用ArkTS的方法。 2. **在H5中调用注册对象的方法**:在H5JavaScript中,直接调用注册在`window`对象上的ArkTS对象的方法。示例代码(ArkTS): ```typescript@Entry@Componentstruct WebComponent {controller: WebviewController= newWebviewController();//定义一个对象,包含要暴露给H5的方法testObj ={test:() =>{return "Hellofrom ArkTS";}}onPageEnd() {//注册对象到H5的window对象上,对象名为'testObjName'this.controller.registerJavaScriptProxy(this.testObj, 'testObjName');}build() {Column() {Web({ src: $rawfile("index.html"),controller:this.controller}).javaScriptAccess(true).onPageEnd(this.onPageEnd.bind(this))}}} ```H5页面(index.html)代码: ```html<button type="button" onclick="callArkTS()">Click Me!</button> <pid="demo"></p><script>functioncallArkTS(){//调用注册的ArkTS对象的方法let str= testObjName.test();document.getElementById("demo").innerHTML= str;console.info('ArkTS HelloWorld!:'+ str);} </script>``` ###双向通信的完整流程1. **ArkTS调用H5**:使用`runJavaScript()`执行H5中的函数,并可以通过字符串传递数据。2.**H5调用ArkTS**:通过注册的代理对象调用ArkTS方法,ArkTS方法可以返回数据给H5。###注意事项-确保在Web组件中启用了JavaScript访问(`.javaScriptAccess(true)`)。 -注册代理对象需要在页面加载完成后(例如`onPageEnd`事件中)进行,以确保H5页面已经准备好。###引用说明以上实现方式参考了HarmonyOS官方文档中关于ArkTSH5交互的说明[^1][^2][^3][^5]。§§相关问题§§1.在HarmonyOS中,如何确保ArkTSH5交互的安全性? 2.除了`runJavaScript`和`registerJavaScriptProxy`,还有哪些方法可以实现ArkTSH5的通信?3.如何处理ArkTSH5之间传递复杂数据类型(如对象、数组)?</think>### HarmonyOSArkTSH5交互方式详解 在HarmonyOS中,ArkTSH5交互主要通过**Web组件**实现双向通信,核心方法包括`runJavaScript()`和`registerJavaScriptProxy()`。以下是具体实现方式: --- #### 一、ArkTS调用H5方法 通过`runJavaScript()`执行H5侧的JavaScript函数: ```typescript @Entry @Component struct WebComponent { controller: WebviewController = new WebviewController() build() { Column() { Web({ src: $rawfile("index.html"), controller: this.controller }) .javaScriptAccess(true) .onPageEnd(() => { // 调用H5函数并传递数据 this.controller.runJavaScript('window.h5Function("ArkTS数据")') }) } } } ``` --- #### 二、H5调用ArkTS方法 1. **ArkTS注册方法** 使用`registerJavaScriptProxy()`将ArkTS对象暴露给H5: ```typescript class ArkTSHandler { // 供H5调用的方法 processData(data: string) { console.log("H5传递的数据:", data) return "处理结果" } } onPageEnd() { // 注册对象到H5的window this.controller.registerJavaScriptProxy( new ArkTSHandler(), "arkTSHandler" // H5通过此名称调用 ) } ``` 2. **H5触发调用** 在HTML中直接调用注册的ArkTS对象: ```html <button onclick="callArkTS()">调用ArkTS方法</button> <script> function callArkTS() { // 调用ArkTS注册的方法 const result = arkTSHandler.processData("H5数据"); console.log("ArkTS返回结果:", result) } </script> ``` --- #### 三、双向通信流程 1. **数据传递** - ArkTSH5:通过`runJavaScript()`执行H5函数并传递参数 - H5ArkTS:通过注册的代理对象直接调用方法 2. **回调机制** ArkTS可通过`runJavaScript()`执行H5的回调函数: ```typescript // ArkTS中 this.controller.runJavaScript(`h5Callback('${arktsData}')`) ``` --- #### 四、关键配置 | 功能 | 方法/属性 | 说明 | |---------------------|--------------------------|--------------------------------------| | 启用JS交互 | `.javaScriptAccess(true)` | 必须开启才能执行JS | | 注册ArkTS对象 | `registerJavaScriptProxy` | 暴露对象到H5的window环境 | | 执行H5代码 | `runJavaScript()` | 动态执行H5函数或脚本 | | 页面加载完成事件 | `.onPageEnd()` | 最佳注册/调用时机 | --- #### 五、应用场景 1. **混合开发**:H5页面嵌入原生应用(如活动页、广告) 2. **动态更新**:不发版更新部分UI逻辑 3. **桥接功能**:H5调用设备能力(摄像头、GPS)[^2][^5] > 安全提示:应对H5传递的数据进行校验,防止注入攻击[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarmonyOS开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值