HarmonyOS鸿蒙应用开发——原生与H5通信框架DSBrigde-HarmonyOS

文章目录

    • 介绍
    • 安装
    • 使用
      • 原生
      • JavaScript
      • 进度回调
    • 参考

介绍

HarmonyOS版的DSBridge,通过本库可以在鸿蒙原生与JavaScript完成交互,相互调用彼此的功能。

目前兼容Android、iOS第三方DSBridge库的核心功能,基本保持原来的使用方式,可以放心接入到项目中,后续会持续迭代保持与Android库相同的功能,减少前端和客户端的适配工作。

支持的功能:

  • 支持以类的方式集中统一管理API;
  • 支持同步和异步调用;
  • 支持进度回调/回传:一次调用,多次返回;
  • 支持API是否存在的测试 (当前仅支持检测原生API,在调用call()方法时会自检测)

暂不支持的功能:

  • 不支持API命名空间
  • 不支持JavaScript的事件侦听器关闭页面

源码:

  • DSBridge-HarmonyOS
  • DSBridge-Android
  • DSBridge-IOS

由于DSBridge库作者已经停止维护了,Android端建议使用 https://github.com/751496032/DSBridge-Android ,目前本人在维护。

安装

ohpm install @hzw/ohos-dsbridge

使用

原生

1、在原生新建一个类继承BaseBridge,实现业务API
, 通过类来集中统一管理API,方法用@JavaScriptInterface()标注,是不是很眼熟呢,加一个@JavaScriptInterface()标注主要为了使用规范,是自定义的装饰器,与Android保持一致性。

export class JsBridge extends BaseBridge {private cHandler: CompleteHandler = null/*** 同步* @param p* @returns*/@JavaScriptInterface(false)testSync(p: string): string {LogUtils.d("testSync: " + JSON.stringify(p))return "hello native"}/*** 异步* @param p* @param handler*/@JavaScriptInterface()testAsync(p: string, handler: CompleteHandler) {LogUtils.d("testAsync: " + JSON.stringify(p))this.cHandler = handler}
}

其中方法中的形参CompleteHandler,可用于异步回调。

2、在原生Web初始化,通过API类将JS代理对象注入到JS中,如下:

private controller: WebviewController = new webView.WebviewController()
private jsBridge = new JsBridge(this.controller)Web({ src: this.localPath, controller: this.controller }).javaScriptAccess(true).javaScriptProxy(this.jsBridge.javaScriptProxy))        

3、在JavaScript中通过dsBridge对象调用原生API,第一个参数是原生方法名称,第二参数是原生方法接收的参数,异步方法有第三个参数,是回调函数,会接收CompleteHandler异步回调结果。

// 同步
let msg = dsBridge.call('testSync', JSON.stringify({data: 100}))// 异步
dsBridge.call('testAsync', JSON.stringify({data: 200}), (msg) => {updateMsg(msg)
})

JavaScript

1、在JavaScript中初始化dsBridge,通过cdn或者npm安装都可以。

如果项目没有历史包袱,建议直接用m-dsbridge包。

npm i m-dsbridge
// 或者cdn引入
<script src="https://cdn.jsdelivr.net/npm/m-dsbridge@1.0.0/dsBridge.js"></script>

或者直接用原Android或iOS的DSBridge库的JS脚本也行,可能会存在某些API不支持,前面已经有介绍了,但核心功能API是支持的。

2、通过dsBridge对象注册Js函数,供原生调用。

// 注册同步函数
dsBridge.register('showAlert', function (a, b, c) {// return "原生调用JS showAlert函数"alert("原生调用JS showAlert函数" + a + " " + b + " " + c)return true})// 注册异步函数
dsBridge.registerAsyn('showAlertAsync', function (a, b, c, callback) {let counter = 0let id = setInterval(() => {if (counter < 5) {callback(counter, false)alert("原生调用JS showAlertAsync函数" + a + " " + b + " " + c + " " + counter)counter++} else {callback(counter, true)alert("原生调用JS showAlertAsync函数" + a + " " + b + " " + c + " " + counter)clearInterval(id)}}, 1000)})

其中异步的callback函数,如果最后一个参数返回true则完成整个链接的调用,false则可以一直回调给原生,这个就是JavaScript端的一次调用,多次返回。比如需要将JavaScript端进度数据不间断同步到原生,这时就可以派上用场了。

3、原生通过API实现类来调用JavaScript所注册的函数。

Button("调用js函数-同步").onClick(() => {this.jsBridge.callJs("showAlert", [1, 2, '666'], (v) => {this.msg = v + ""})})Button("调用js函数-异步").onClick(() => {this.jsBridge.callJs("showAlertAsync", [1, 2, '666'], (v) => {this.msg = v + ""})})}

callJs()方法有三个形参,第一个是Js注册的函数名称,第二个是Js接收函数的参数,是一个数组类型,第三个是监听Js函数返回结果的函数。
另外也提供了与Android库一样调用函数callHandler()

进度回调

前面提到了JavaScript端的一次调用,多次回调的情况,在原生端也是支持的,还是有应用场景的,比如将原生的下载进度实时同步到js中,可以通过CompleteHandler#setProgressData()方法来实现。

  @JavaScriptInterface()testAsync(p: string, handler: CompleteHandler) {LogUtils.d("testAsync: " + JSON.stringify(p))this.cHandler = handlerlet counter = 0setInterval(() => {if (counter < 5) {counter++handler.setProgressData("异步返回的数据--" + counter)} else {this.cHandler.complete("异步返回的数据--结束")this.cHandler.complete("异步返回的数据--结束2")}}, 1000)

JavaScript:

dsBridge.call('testAsync', JSON.stringify({data: 200}), (msg) => {updateMsg(msg)
})

具体可以参考demo。

参考

  • DSBridge-Android:https://github.com/wendux/DSBridge-Android

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

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

相关文章

c++|关键字extern

一个C语言项目往往由多个文件组合而成。而对于多个文件来说&#xff0c;它们可能会共用到一些相同的变量。而有些情况下&#xff0c;这些相同的变量并没有出现在本文件内&#xff0c;有可能在其他文件内。而一个文件可能只会搜寻该文件内部是否有该变量。 所以&#xff0c;需要…

c++的构造函数

目录 构造函数 1.构造函数&#xff1a; 2.构造函数的特点&#xff1a; 默认构造函数 -- 没有参数的构造函数 1. 合成(自动)的默认构造函数(一般不常用) 1&#xff09; 介绍&#xff0c;以及为什么不使用 2&#xff09;可以使用合成默认构造函数的情况 2. 自定义的默认…

xss-labs(6-9)

level6:欢迎来到level6 老规矩还是先看看输入框的闭合情况 尝试事件函数绕过 test" onclick="alert(欢迎来钓鱼) 既然事件函数被转义了,那就使用我们第二关用过的绕过方法插入标签看看 test"><script>alert(欢迎来钓鱼)</script>// <

新书速览|循序渐进Vue.js 3.x前端开发实战

Vue.js初学者和前端开发人员使用&#xff0c;网课、培训机构与大中专院校的教学用书 作者简介 张益珲 美国亚利桑那州立大学计算机工程技术硕士&#xff0c;架构师&#xff0c;从业近10年&#xff0c;多年大前端开发经验&#xff0c;曾就职于知名上市公司&#xff0c;主导开发…

go 语言常见问题(2)

11. recover的执行时机 无&#xff0c;recover 必须在 defer 函数中运行。recover 捕获的是祖父级调用时的异常&#xff0c;直接调用时无效。 func main() {recover()panic(1) }直接 defer 调用也是无效。 func main() {defer recover()panic(1) }defer 调用时多层嵌套依然无…

算法训练营Day42(背包问题)

基础 非竞赛只需要搞懂0-1背包和完全背包 0-1背包基础 0-1背包是完全背包和多重背包的基础 n个物品&#xff0c;每个物品一个&#xff0c;每个物品有自己的重量和价值&#xff0c;&#xff0c;一个背包能装m物品&#xff0c;问最多装多少物品。 暴力解法&#xff0c;n个物品…

Acwing845 八数码

在2019年y神认为是困难题&#xff0c;2023年便是中等题了。。。嗯。。。 题目 在一个 33的网格中&#xff0c;1∼8 这 8个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个…

SpringMVC 的入门

SpringMVC 的入门 1环境搭建 1.1.创建工程 1.2.添加web支持 右键项目选择Add framework support... 2.添加web支持 ​ 3.效果 注意&#xff1a; 不要先添加打包方式将web目录要拖拽到main目录下&#xff0c;并改名为webapp 1.3.pom.xml <?xml version"1.0&q…

鱼哥赠书活动第⑥期:《内网渗透实战攻略》看完这本书教你玩转内网渗透测试成为实战高手!!!!

鱼哥赠书活动第⑥期&#xff1a;《内网渗透实战攻略》 如何阅读本书&#xff1a;本书章节介绍&#xff1a;本书大致目录&#xff1a;适合阅读对象&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; 当今&#xff0c;网络系统面临着越来越严峻的安全挑战。在众多的安全挑战中&…

7双指针问题-接雨水2

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

控制注塑机PQ比例阀放大器

控制不带电反馈的单或双比例电磁铁的博世力士乐&#xff08;Bosch Rexroth&#xff09;、伊顿威格士&#xff08;EATON Vickers&#xff09;、油研&#xff08;YUKEN&#xff09;、贺德克&#xff08;HYDAC&#xff09;、大金&#xff08;DAIKIN&#xff09;、不二越&#xff0…

ubuntu系统笔记导览

本笔记主要是为了方便查找和回顾学习&#xff0c;如果后续该系列更新时会同步更新在此导览中。 ubuntu系统中Error&#xff1a;No space left on device&#xff0c;解决办法&#xff1a;挂载大容量sda分区_unbuntu编译报错设备上没空间-CSDN博客 ubuntu系统&#xff08;2&am…

网安入门13-文件上传(htaccess,其他绕过)

空格绕过&#xff0c;点号绕过 Pass-07 直接上传肯定是失败的 把文件名1.php改成1.php.或1.php_(下划线为空格)&#xff0c;这种命名方式在windows系统里是不被允许的&#xff0c;所以需要在burp之类里进行修改&#xff0c;然后绕过验证后&#xff0c;会被windows系统自动去掉…

数据库-列的类型-浮点数,定点数-数据类型

类型占用空间负数取值范围正数取值范围FLOAT4 字节-3.4 x 10^383.4 x 10^38DOUBLE8 字节-1.8 x 10^3081.8 x 10^308DECIMAL(M,d)M2-1.8 x 10^3081.8 x 10^308 M表示数字的总位数&#xff0c;而d表示小数点后的位数 d不能大于m&#xff1b; 创建表 不指定精度 # 创建表 crea…

三维猴打印PCB外壳预留板壳间距

3D文件下单那里有一个“3D模型设计规范”&#xff0c;里面详细讲了设计时要考虑打印的参数细节。如果有其他的设计规范不了解的也可以进去查看&#xff0c;里面写的很详细。 这里是打印PCB外壳预留板壳间距相关说明&#xff1a; 设计模型为装配体&#xff0c;请务必满足装配最…

什么是springmvc(介绍)

什么是springmvc 1. 什么是springmvc2.项目中加入springmvc支持2.1 导入依赖2.2 springMVC配置文件2.3 web.xml配置2.4 中文编码处理 3. 编写一个简单的controller4. 视图层配置4.1 视图解析器配置4.2 静态资源配置4.2 编写页面4.3 页面跳转方式 5. SpringMVC处理请求的流程6. …

纯血鸿蒙「扩圈」100天,酝酿已久的突围

坦白讲&#xff0c;去年参加华为开发者大会看到HarmonyOS NEXT&#xff08;仅运行鸿蒙原生应用&#xff0c;所以也称作「纯血鸿蒙」&#xff09;的时候&#xff0c;小雷也没料想到鸿蒙原生应用生态的发展速度会如此之快。 9月25日&#xff0c;华为正式对外宣布启动HarmonyOS NE…

【C语言】指针——从底层原理到应用

C语言指针-从底层原理到花式技巧&#xff0c;用图文和代码帮你讲解透彻 目录 一、前言二、变量与指针的本质 1. 内存地址2. 32位与64位系统3. 变量4. 指针变量5. 操作指针变量 5.1 指针变量自身的值5.2 获取指针变量所指向的数据5.3 以什么样的数据类型来使用/解释指针变量所指…

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…

2024年软考选哪科?什么时候考试?

软考是指计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;是由中国工业和信息化部&#xff08;前身为工信部&#xff09;以及人力资源和社会保障部&#xff08;前身为人社部&#xff09;领导下的国家级考试。 软考共设有27个不同的资格类别&#xf…