在 HarmonyOS 上实现 ArkTS 与 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 侧的异步数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176800.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易基因:综合全基因组DNA甲基化和转录组学分析鉴定调控骨骼肌发育潜在基因 | 研究进展

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 DNA甲基化是骨骼肌发育中关键的表观遗传调控机制。但胚胎鸭骨骼肌发育中负责DNA甲基化的调控因子仍然未知。 2023年10月23日,南京农业大学动物科技学院于敏莉副教授团队在《…

element ui + echarts点击表格显示对应的图形

一、vue封装饼图、树状图、雷达图等组件 目录 resize.js需要utils.js utils.js import { parseTime } from ./yunhis/*** 表格时间格式化*/ export function formatDate(cellValue) {if (cellValue null || cellValue "") return "";var date new Da…

Vue dev-tools的安装

安装 Vue 开发者工具,装插件调试Vue应用 1.通过谷歌应用商店来进行安装(国外网站) 2.极简插件: 搜索 Vue -> 下载解压 -> 浏览器扩展模式打开,开发者模式 -> 将解压的CRX文件拖拽安装 -> 插件详情 &…

Vue3源码reactive和readonly对象嵌套转换,及实现shallowReadonly

前言 官方文档中对reactive的描述: 响应式转换是“深层”的:它会影响到所有嵌套的属性。一个响应式对象也将深层地解包任何 ref 属性,同时保持响应性。 官方文档中对readonly的描述: 只读代理是深层的:对任何嵌套属性的访问都将是…

CSS特效007:绘制3D文字,类似PS效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

AI数字员工创新工作模式丨市女协走进实在智能,沉浸体验RPA Agent智能魅力

11月10日,杭州市女企业家协会组织走进副会长张军燕企业——杭州实在智能科技有限公司,开展“领跑AI时代,做先进企业”人工智能沙龙活动。 本次沙龙是一场真正关注最前沿AI大模型与RPA自动化技术、寻找企业确定性增长的科技盛宴,也…

Python爬虫程序网络请求及内容解析

目录 引言 一、网络请求 1. 导入必要的库 2. 发送请求 3. 处理响应 二、内容解析 1. HTML解析 2. 查找特定元素 3. 查找多个元素 4. 使用选择器选择元素 三、应用示例:爬取网站文章并解析标题和内容 1. 发送请求并解析HTML内容 2. 查找文章元素并提取标…

GB28181设备对接视频流的流程

搭建CG28181 服务端,也即 SIP Server,这正是我们要实现的。实现CG28181服务端可以借助于现有的开源库 PJSIP,具体的实现步骤如下: 1、启动GB28181服务端,接收客户端消息请求 bool Init(std::string concat, int logL…

LeetCode 189.轮转数组(三种方法解决)

文章目录 题目暴力求解空间换时间三段逆置总结 题目 LeetCode 189.轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5…

Nginx 使用笔记大全(唯一入口)

Linux服务器因为Nginx日志access.log文件过大项目无法访问 项目处于运行状态下无法访问,第一步查看磁盘状态 1、查看磁盘状态 df -h 2、查找100M以上的文件 find / -size 100M |xargs ls -lh 3、删除文件 rm -rf /usr/local/nginx/logs/access.log 4、配置nginx.…

keil和proteus联动要点

一、keil与proteus如何进行联动? 1.先安装vdmagdi.exe,这是驱动 2.要保证keil工程编译通过,左上角红色图标进行编译,黑色框图标进行链接。 3.生成hex文件 先点击这个图标 按照顺序点击,生成HEX文件。 4.在打开的prot…

Redis 连接不上 WRONGPASS invalid username-password pair

1.我的RedisDesktopManager 可以连接 但是 Springboot远程使用Redis就是连不上 2.我的密码是 abc123.. 多了英文的 ..符号 在Springboot过不了,所以Redis密码尽量字母数字,不要其他符号