在 HarmonyOS 上实现 ArkTS 与 H5 的交互

news2024/11/17 13:34:03

介绍

本篇 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.coloradmin.cn/o/1205352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue实战项目】通用管理系统:封装token操作和网络请求

目录 1.概述 2.封装对token的操作 3.封装axios 1.概述 前文我们已经完成了登录页: 【vue实战项目】通用管理系统:登录页-CSDN博客 接下来我们要封装一下对token的操作和网络请求操作。之所以要封装这部分内容是因为token我们登陆后的所有请求都要携…

lamp环境搭建(kali,docker,ubuntu)

学了微专业,然后第一节课是学的搭建自己的环境,这里记录一下吧。 搭建一个lamp环境 (因为本人使用的是kali而且还带有集成环境的xampp,本身就自带了apache2,mysql和php。)后面有用ubuntu从0开始搭建的。 在kali环境下: 1.首先查看apache2和mysql和php 查看apache2 where…

二、Linux用户管理

Linux是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须向系统管理员申请一个账户,然后用这个账户进入系统。 每个Linux用户至少属于一个用户组。 用户家目录home下,有各个用户分别创建的家目录&#xf…

全域全自主建设,亚信科技AntDB数据库助力广电5G业务上线运行

自2019年6月,中国广电成功获得5G牌照以来,迅速推进网络建设目标,成为5G网络覆盖广、应用场景多、用户体验出色的第四大运营商。其依托全球独有的700MHz频谱资源,具备覆盖能力强、容量足、速率高的优势。通过不断深化和中国移动的共…

进行 “最佳价格查询器” 的开发(多种并行方式的性能比较)

前置条件 public class Shop {private final String name;private final Random random;public Shop(String name) {this.name name;random new Random(name.charAt(0) * name.charAt(1) * name.charAt(2));}public double getPrice(String product) {return calculatePrice…

让AI拥有人类的价值观,和让AI拥有人类智能同样重要

编者按:2023年是微软亚洲研究院建院25周年。25年来,微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式,并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来,微软亚洲研究院致力于创造具有…

python中的切片操作

切片操作: 1.切片操作是访问元素序列的另一种方法,它可以访问一定范围内的元素。通过切片操作形成一个新序列 语法结构: 序列【start:end:step】 参数说明: start:表示切片的开始位置&#x…

027 - STM32学习笔记 - ADC初识(一)

026- STM32学习笔记 - ADC初识(一) 前几天不小心把板子掉地上了,液晶屏摔坏了,暂时先停一下液晶屏的学习,等新的板子来了再继续学习。 一、ADC介绍 ADC指的是Analog to Digital Converter(模数转换器&…

​2005/2008-2022逐年道路网分布数据

道路网(road network)指的是在一定区域内,由各种道路组成的相互联络、交织成网状分布的道路系统。全部由各级公路组成的称公路网。在城市范围内由各种道路组成的称城市道路网。 城市道路网由城镇管辖范围内的各种不同功能的干道和区域…

Collectors.groupingBy方法的使用

Collectors.groupingBy方法的使用 简单使用 业务场景:现在有5个人,这些人都年龄分部在18-30岁之间。现要求把他们按照年龄进行分组 key:年龄 value:数据列表 package com.liudashuai;import java.util.Arrays; import java.uti…

2020年五一杯数学建模C题饲料混合加工问题解题全过程文档及程序

2020年五一杯数学建模 C题 饲料混合加工问题 原题再现 饲料加工厂需要加工一批动物能量饲料。饲料加工需要原料,如加工猪饲料需要玉米、荞麦、稻谷等。加工厂从不同的产区收购了原料,原料在收购的过程中由于运输、保鲜以及产品本身属性等原因&#xff…

windows服务器热备、负载均衡配置

安装网络负载平衡 需要加入的服务器上全部需要安装网络负载平衡管理器 图形化安装:使用服务器管理器安装 在服务器管理器中,使用“添加角色和功能”向导添加网络负载均衡功能。 完成向导后,将安装 NLB,并且不需要重启计算机。 …

Unity Hub无法登陆的两种终极解决办法

最近换了个电脑,需要重装Unity, 然后unity hub 怎么都无法登陆,登陆不了就不能激活personal license。试了很多次,包括unity hub 2.5.8 和unity hub 3.3都不行,真的是很崩溃。因为是公司的电脑,限制比较多&…

【系统安装】ubuntu20.04启动盘制作,正经教程,小白安装教程,百分百成功安装

1.所需材料: 64GBU盘(其实8g和16g也可以) 2.制作U盘启动盘 使用windows制作ubuntu 20.04启动盘 1)下载制作工具:Rufus:Rufus - 轻松创建 USB 启动盘 2)插入用来做启动盘的U盘 3&#xff0…

nodejs+vue+python+PHP+微信小程序-安卓- 电影在线订票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

qnx log 系统

前言 本文主要介绍QNX 系统中的 log 打印相关接口和使用方法 软件环境:qnx7.1 一、QNX查看 log 的工具 slog2info 1. slog2info 的相关介绍 和linux 中查看 kernel log 信息的 dmesg 命令一样, qnx 里面也有一个查看 log 信息的命令,那就是 slog2info 命令, 如下图所示是…

Jenkins的介绍与相关配置

Jenkins的介绍与配置 一.CI/CD介绍 1.CI/CD概念 ①CI 中文意思是持续集成 (Continuous Integration, CI) 是一种软件开发流程,核心思想是在代码库中的每个提交都通过自动化的构建和测试流程进行验证。这种方法可以帮助团队更加频繁地交付软件&#x…

无监督学习的集成方法:相似性矩阵的聚类

在机器学习中,术语Ensemble指的是并行组合多个模型,这个想法是利用群体的智慧,在给出的最终答案上形成更好的共识。 这种类型的方法已经在监督学习领域得到了广泛的研究和应用,特别是在分类问题上,像RandomForest这样…

【深度学习】机器翻译的前世今生

我们都知道谷歌翻译,这个网站可以像变魔术一样在100 种不同的人类语言之间进行翻译。它甚至可以在我们的手机和智能手表上使用: 谷歌翻译背后的技术被称为机器翻译。它的出现改变了世界交流方式。 事实证明,在过去几年中,深度学习…

搜索引擎项目

认识搜索引擎 1、有一个主页、有搜索框。在搜索框中输入的内容 称为“查询词” 2、还有搜索结果页,包含了若干条搜索结果 3、针对每一个搜索结果,都会包含查询词或者查询词的一部分或者和查询词具有一定的相关性 4、每个搜索结果包含好几个部分&…