HarmonyOS ArkTS Web组件jsbridge

news2024/11/26 14:47:11

1. HarmonyOS ArkTS Web组件jsbridge

1.1. Web组件引入和调用JS库

  关于ts可以调用JS库,可以使用以下几种方式:文档中心:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkweb-kit-V5
在这里插入图片描述

1.1.1. 鸿蒙系统H5 JSBridge的优势

  相比其他移动操作系统,鸿蒙系统的H5 JSBridge具有以下优势:
  易用性:JSBridge提供了一套简单易用的API,使得前端开发人员可以方便地进行调用和交互。
  扩展性:开发人员可以根据自己的需求自定义原生模块,提供更多的功能和交互效果。
  跨平台支持:鸿蒙系统的JSBridge可以在不同的平台上使用,包括Android、iOS和Web等。

1.1.2. 鸿蒙系统H5 JSBridge的应用场景

  鸿蒙系统的H5 JSBridge可以应用于各种场景,包括但不限于:
  获取设备信息:开发人员可以使用JSBridge调用原生API获取设备的型号、操作系统版本等信息,以便进行针对性的优化和适配。
  调用原生功能:开发人员可以使用JSBridge调用原生功能,例如打开摄像头、获取位置信息等,以实现更多的功能和交互效果。
  数据传递和共享:JSBridge可以实现前端和原生之间的数据传递和共享,方便实现数据的同步和共享。

1.2. jsbridge

  文档地址:https://ohpm.openharmony.cn/#/cn/detail/@ncc%2Fjsbridge

1.2.1. 简介

  随着智能手机的普及,移动应用的需求日益增长。而在开发移动应用时,前端开发人员需要与原生平台进行交互,以实现更多的功能和优化用户体验。鸿蒙系统提供了一个强大的H5 JSBridge工具,使得前端开发人员可以方便地与鸿蒙系统进行通信和交互。
  JSBridge是一种将JavaScript代码和原生代码进行桥接的技术。它允许前端开发人员通过JavaScript调用原生代码,实现更多的功能和交互效果。鸿蒙系统的JSBridge提供了一套标准的API,方便开发人员进行调用。
  JSBridge 是基于 OpenHarmony Web 组件的 JavaScriptProxy 机制开发的三方库,提供了 bridge 形式的 ArkTS 和 JavaScript 相互调用接口。
  通过简单的函数注册和初始化后,便可以使用下面的接口进行 ArkTS 与 JavaScript 的相互调用:

// In ArkTS
jsbridge.post('jsFuncName', param1, param2, ...);
// In Javascript (Html)
jsbridge.call('etsFuncName', param1, param2, ...);

1.2.2. 下载安装

ohpm install @ncc/jsbridge

  OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包
  上面接口参数中出现自定义类型声明如下:

type SupportTypes = string | number | boolean;
type SupportMethod = (...params: SupportTypes[]) => void | SupportTypes;
type NotFoundHander = (funcName: string) => void | SupportTypes;

1.2.3. 使用示例

  下面一个简单的 Web 页面为例子,展示本库的使用:

import web_webview from '@ohos.web.webview'
import JSBridge from '@ncc/jsbridge'

@Entry
@Component
struct Index {
  @State message: string = "Show something"
  controller: web_webview.WebviewController = new web_webview.WebviewController()
  isReady: boolean = false;
  // 创建 JSBridge 实例
  jsbridge: JSBridge = new JSBridge(this.controller)
  build() {
    Column() {
      Row() {
        Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
          Text(this.message)
            .fontSize(18).fontWeight(700).fontColor('#000000')
        }
      }.padding({ left: 20, right: 20, bottom: 20, top: 0 }).width('100%') 
      Row() {
        Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {
          Button("Call JS function").width('100%')
            .onClick((e) => {
              if (this.isReady) {
                // 通过 jsbridge.post('xxx', xxx) 调用 js 函数
                const str = "My string to call JS";
                this.jsbridge.post('changeWebMessage', str);
              }
            })
        }
      }
      Row() {
        // Web 组件
        Web({ src: $rawfile("example1.html"), controller: this.controller })
          // 此处使用的 onControllerAttached 是 API10 新增,API9 可以选用其它事件或在其它时机进行
          .onControllerAttached(() => {
            if (!this.isReady) {
              // 在 controller 与 web 关联后才能进行 bridge 的初始化
              this.jsbridge.initBridge();
              // 添加支持的方法
              this.jsbridge.register({ 'changeNativeMessage': this.changeNativeMessage });
              this.isReady = true;
            }
          })
      }.padding({ left: 20, right: 20, bottom: 20, top: 0 })
      .width('100%')
    }
  }
  // 一个本地 ArkTS 函数
  changeNativeMessage = (message: string) => {
    this.message = message;
  }
}
<!-- local.html -->
<!DOCTYPE html>
<html>
<body>
    <p>
        <input type="text" id="input" value="Message to Native">
    </p>
    <p>
        <button id="button"> Click to call ArkTS funcA() </button>
    </p>
    <div id="text">This is some message.</div>
    <script>
const button = document.getElementById("button");
const input = document.getElementById("input");
const text = document.getElementById("text");

button.addEventListener('click', function() {
  // 通过 jsbridge.call('xxx', xxx) 调用 ArkTS 函数
  jsbridge.call('changeNativeMessage', input.value);
});
function changeWebMessage(str) {
  text.innerHTML = str;
}
    </script>
</body>
</html>

  在上面的例子中,Web 端和应用端都有一个按钮用于彼此间的调用。
  (1)通过 jsbridge.post,应用端调用 Web 端的 js 函数,将 Web 端的 div 内的文本修改为 My string to call JS;
  (2)通过 jsbridge.call,Web 端调用应用端的 ArkTS 函数,将 Web 端上方的一行文本修改为 input 输入的内容。

1.2.4. 详细说明

  下面一个简单的 Web 页面为例子,展示本库的使用:

1.2.4.1. 引用库
import JSBridge from '@ncc/jsbridge'

  实例创建与关联
  创建的实例需要与一个 web_webview.WebviewController 关联。
  示例:

// 方式一:创建后关联
let jsbridge = new JSBridge();
jsbridge.attachController(webviewController);
// 方式二:创建时关联
let jsbridge = new JSBridge(webviewController);
Bridge初始化/移除

  初始化需要在 webviewController 与 Web 组件关联后。初始化会向 WebviewController 注册一个 Bridge Object,用于 Web 端调用本地 ArkTS 函数。
  示例如下:

try {
  // 传入参数为 Web 侧的 Bridge Object 名
  // 下面的示例中,初始化后,Web 侧可以使用下面的方式进行调用
  // jsbridgeName.call(xxx, ...)
  // Name 为可选参数,默认情况下为 'jsbridge'
  jsbridge.initBridge('jsbridgeName');
} catch (error) {
  // 如果在 controller 未与 Web 组件关联时调用会抛出错误
  console.log(error.message);
}

  想要取消这一注册,可以使用下面的接口:

try {
  jsbridge.removeBridge();
} catch (error) {
  console.log(error.message);
}

  注意:每次调用 initBridge 时,都会对 webviewController 进行一次刷新(使用 fresh 接口),因此请确保 initBridge 的调用时机在掌控中,或是它只会被调用一次,以避免造成不可控的影响。

1.2.4.2. 添加/移除可调用的应用侧函数

  可以使用 register 函数向 jsbridge 添加支持的函数。该函数可以多次调用。
  函数同名时,后注册的会覆盖先注册的。示例如下:

// 下面的注册完成后,我们可以在 Web 侧使用 js 调用这两个方法:
// jsbridgeName.call('functionA', 'this is a string', 1)
// jsbridgeName.call('funcB')
jsbridge.register({
  'functionA': functionA,
  'funcB': functionB,
});
// 方法可以有任意的参数数量
// 但是传入参数和返回值仅支持 string/number/boolean
// 对 Object 类型的传入/返回需求可以尝试用 JSON 序列化解决
function functionA(param1: string, param2: number) {
  // do something
}
function functionB() {
  // do something
}

  如果注册的是成员函数等需要上下文的函数,会存在上下文(this)丢失的风险。在定义时使用箭头函数或手动绑定实体是一种不错的解决方案:

class Student {
  name: string = "Alice";
  getName1() {
    return this.name;
  }
  getName2 = () => {
    return this.name;
  }
}
let stu = new Student;
jsbridge.register({'getName1': stu.getName1.bind(stu)});
jsbridge.register({'getName2': stu.getName2});

  移除函数可以使用 unregister 接口:

// 支持传入方法名列表
jsbridge.unregister(['getName1', 'getName2'])
// 也支持只传入一个方法名
jsbridge.unregister('getName1');
1.2.4.3. Web侧调用ArkTS

  通过 jsbridge.call,可以从 Web 侧调用已被注册的 ArkTS 函数:

jsbridge.call('etsFuncName', params);
1.2.4.4. (可选)配置回调函数

  在 Web 侧使用 jsbridge.call 时,如果调用的函数不被支持,call 会代替的以 notFoundHandler 作为回调函数。
  默认情况下,该 handler 会在控制台打印一条: “xxx is not found!”。
  可以通过下面的接口进行配置:

jsbridge.setNotFoundHandler(
// 传入的函数必须接收一个 string 参数
// 且返回值类型必须是 void | string | number | boolean
(funcName: string) => {return funcName + ’ is not found!';}
);
应用侧调用JS
JSBridge 还基于 WebviewController 的 runJavaScript 接口封装了 post 函数,用于应用侧调用 Web 侧函数。

// 支持直接传入 JS 代码
jsbridge.postJS("jsFunctionA('param1', 1, 2);");
// 也支持 post('xxx', xxx) 的调用形式
// 使用此接口传入的参数,都会被自动序列化后拼接起来
jsbridge.post('jsFunctionA', string1, number1, number2);
1.2.4.5. JS 异步调用 ArkTS 函数的实现方案

  本库基础实现的 jsbridge.call 是同步调用。因此我们在此处给出在 JS 侧进一步封装为基于 Promise 的异步调用的方案:

// 'jsbridge' 需替换为 init 时的 jsbridgeName
// 使用 AsyncJSBridge.callAsync(funcName, ...params) 就可以异步调用 Native 函数
const _JSBridge = self['jsbridge'];

const AsyncJSBridge = {
    call: (funcName, ...params) => {
        // 同步调用接口
        return _JSBridge.call(funcName, ...params);
    },
    callAsync: (funcName, ...params) => {
        // 异步调用接口
        return new Promise((resolve, reject) => {
            try {
                let res = _JSBridge.call(funcName, ...params);
                resolve(res);
            } catch (error) {
                reject(error);
            }
        });
    }
}

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

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

相关文章

C++笔试题之实现一个定时器

一.定时器&#xff08;timer&#xff09;的需求 1.执行定时任务的时&#xff0c;主线程不阻塞&#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用&#xff0c;一个timer需要能够管理多个定时任务&#xff0c;所以timer要支持增删任务…

DICOM标准:CR图像模块属性详解——计算放射线照相术(CR)及其在DICOM中的表示

目录 CR图像及其在DICOM中的表示 1 计算放射线照相术 1.1 CR序列组件 1.1 -- CR 序列模块属性 1.2 CR 图像模块 表1.2 -- CR 图像模块属性 结论 CR图像及其在DICOM中的表示 计算放射线照相术&#xff08;Computed Radiography, CR&#xff09;是一种利用计算机技术对传统…

[Prometheus学习笔记]从架构到案例,一站式教程

文章目录 Prometheus 优势Prometheus 的组件、架构Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标&#xff0c;它在本地存储所有抓取到的样本数据&#xff0c;并对此数据执行一系列规则&#xff0c;以汇总和记录现有数据的新时间序列或生成告警。可以通…

Javaweb梳理3——SQL概述+DDL语句1

Javaweb梳理3——SQL概述DDL语句1 Javaweb梳理3——SQL概述DDL语句13.1 SQL简介3.2 通用语法3.3 SQL分类3.4 DDL:操作数据库3.4.1 查询数据库3.4.2 创建数据库3.4.3 删除数据库3.4.4 使用数据库 Javaweb梳理3——SQL概述DDL语句1 3.1 SQL简介 英文&#xff1a;Structured Que…

HarmonyOS Next星河版笔记--界面开发(2)

ArkUI-界面开发 位置&#xff1a;在build(){}中去编写代码 //以前学基础 ->写代码的位置&#xff08;页面顶部&#xff09; Entry Component struct Index {State message: string Hello World; //构建 -> 页面build() {//行//列RelativeContainer() {//文本 函数名&a…

使用PostgreSQL进行高效数据管理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…

vue3学习记录-单文件组件 CSS 功能

vue3学习记录-单文件组件 CSS 功能 1.组件作用域 CSS1.1为什么要用到样式穿透&#xff08;&#xff1a;deep&#xff08;&#xff09;&#xff09;1.2 插槽选择器:slotted(div)1.3 全局选择器:global 2.CSS Modules2.1 基本用法2.2 自定义注入名称2.3 与组合式 API 一同使用 3.…

3.1 快速启动Flink集群

文章目录 1. 环境配置2. 本地启动3. 集群启动4. 向集群提交作业4.1 提交作业概述4.2 添加打包插件4.3 将项目打包4.4 在Web UI上提交作业4.5 命令行提交作业 在本实战中&#xff0c;我们将快速启动Apache Flink 1.13.0集群&#xff0c;并在Hadoop集群环境中提交作业。首先&…

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …

产品宣传册如何分享到微信朋友圈

在这个互联网高速发展的时代&#xff0c;微信已经成为我们日常生活中不可或缺的社交工具。作为商家或个人&#xff0c;如何将产品宣传册分享到微信朋友圈&#xff0c;提高产品知名度和影响力&#xff0c;成为了一项至关重要的技能。 那要怎么操作呢&#xff1f; 1. 实用工具&a…

轻松入门WordPress:在Ubuntu上搭建本地网站并配置公网访问地址

文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式&#xff1a;4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站&#xff0c…

ubuntu编译内核安装启动

下载源码 apt update apt install linux-source # /usr/src/linux-source-5.4.0/linux-source-5.4.0.tar.bz2 下载源码 tar -jxvf linux-source-5.4.0.tar.bz2 # /usr/src/linux-source-5.4.0 解压源码 安装依赖 sudo apt -y install build-essential sudo apt -y i…

多个锚点定位时的锚点优选方法(附公式和MATLAB代码讲解)

在多锚点定位系统中,锚点的选择对定位精度有重要影响。以下是几种常见的锚点选优方法,配合相应的公式和MATLAB代码示例进行详细分析。 文章目录 基于几何分布的选择基于距离最小化的选择加权优化选择总结基于几何分布的选择 方法描述: 锚点的几何分布影响定位的可辨识性。选…

DICOM标准:US超声模块属性详解——超声医学的DICOM标准解析

引言 数字成像和通信在医学领域中的应用极为广泛&#xff0c;其中DICOM&#xff08;数字成像和通信医学&#xff09;标准对于确保不同设备和系统之间的兼容性和互操作性至关重要。本文将详细介绍DICOM标准中关于超声医学&#xff08;Ultrasound, US&#xff09;的部分&#xff…

华为鲲鹏一体机 安装笔记

安装驱动 在这个链接 社区版-固件与驱动-昇腾社区 1 下载NPU固件 需要注册登录&#xff0c;否则报错&#xff1a; ERR_NO:0x0091;ERR_DES:HwHiAiUser not exists! Please add HwHi AiUser 准备软件包-软件安装-CANN…

STM32H750 USBCDC配置与使用

STM32H750 USBCDC配置与使用 &#x1f4cd;相关参考文章&#xff1a;《STM32 USB CDC VPC》 STM32H750VB有2个USB OTG接口&#xff08;1FS&#xff0c;1HS/FS&#xff09;无晶振型解决方案&#xff0c;带有LPM和BCD。 &#x1f516;本次使用USB-PTG-FS作为测试 &#x1f33f;…

引领数字时代:万码优才如何变革IT人才招聘新体验(这里有更精准的推荐)

目录 引领数字时代&#xff1a;万码优才如何变革IT人才招聘新体验引领未来科技&#xff0c;精准链接IT精英精准匹配&#xff0c;高效对接海量资源&#xff0c;覆盖广泛优化体验&#xff0c;简化流程 全面升级&#xff1a;AI赋能数字人才职业成长AI模拟面试职场千问智能简历评估…

网络安全法详细介绍——爬虫教程

目录 [TOC](目录)一、网络安全法详细介绍1. 网络安全法的主要条款与作用2. 网络安全法与爬虫的关系3. 合法使用爬虫的指南 二、爬虫的详细教程1. 准备环境与安装工具2. 使用requests库发送请求3. 解析HTML内容4. 使用robots.txt规范爬虫行为5. 设置请求间隔6. 数据清洗与存储 三…

vscode插件-08 Golang

文章目录 Go安装其他必须软件 Go Go语言环境&#xff0c;只需安装这一个插件。然后通过vscode命令下载安装其他go环境需要的内容。 程序调试&#xff0c;需要创建.vscode文件夹并编写launch.json文件。 安装其他必须软件 ctrlshiftp&#xff0c;调出命令面板&#xff0c;输入…

ConnectX-7 25/50/100/200/400G NIC

ConnectX-7 25/50/100/200/400G NIC ConnectX-7提供了广泛的软件定义、硬件加速的网络、存储和安全功能&#xff0c;使组织能够现代化和保护他们的IT基础设施。此外&#xff0c;ConnectX-7还支持从边缘到核心数据中心到云的敏捷和高性能解决方案&#xff0c;同时增强网络安全性…