DSBridge---跨端的原生与H5的通信框架

dsBridge介绍

dsBridge是一个三端易用的现代跨平台 Javascript bridge, 通过它,你可以在Javascript和原生之间同步或异步的调用彼此的函数。

最近在开发h5相关的需求,而且相关的h5页面会嵌入到app,h5页面有拍照、上传照片、上传文件等,拍照和上传照片可以使用UI组件提供的功能,但是上传文件这块需要用到原生的上传方法了。调研之后,我选择了dsBridge这个跨平台的Javascript bridge。

我们先看一下如何在项目中使用的:

npm i dsbridge

我目前用的dsbridge版本是3.1.4

首先先封装dsbridge相关的方法
scr/lib/dsbridge.js
代码如下:

import dsBridge from 'dsbridge'

export default {
   // js调用原生(native)的方法入口
   callHandler(name,data,callback){
      dsBridge.call(name,data,callback)
   },
   // 原生(Native)调用的方法使用此方法注册
   registerHandler(tag,callback){
      dsBridge.register(tag,callback)
   }
}

然后在main.js中进行全局注册

// 集成jsbridge
import Bridge from './lib/dsbridge.js'

app.config.globalProperties.$bridge = Bridge

在对应的组件中使用的话

<script setup>
import { getCurrentInstance } from "vue"

const { proxy } = getCurrentInstance() // 获取

// 拍照、上传照片、上传文件
function uploadFile(item){
  proxy.$bridge.callHandler(
       'photo.selectFileAndUpload',
       {
         action:item.value,
         url:`${import.meta.env.VITE_APP_BASE_URL}/api/outer/file/upload`,
         fileType:item.fileType,
         recordId:item.recordId
       },
       (res)=>{
         if(res.status != 'error'){
           dealFile(res)
           ...
         }
       })
}
</script>

这个就是在项目中使用的流程。

我们来看一下在dsBridge的内部原理

1、JavaScript

核心原理
  • 封装DSBridge
    提供注册js的方法register: function (name, fun, asyn);
    调用原生Native的方法call: function (method, args, cb) 等
  • 使用全局对象window,往window注入全局参数,如存储js的注册方法等。
  • native调用的js方法动态注入
    提供bridge.register(name, fun)接口,使用key-value的方式将方法func和方法名method_name。

源码核心

  • JS ----> Native核心:以下是源码缩减版本~
var bridge = {
        // js调用native的方法入口
        call: function (method, args, cb) {
            arg = JSON.stringify(arg)
           
            if(window._dsbridge){
                ret=  _dsbridge.call(method, arg)
            }else if(window._dswk||navigator.userAgent.indexOf("_dsbridge")!=-1){
                //使用时Native会注册_dswk参数
                
                // 调用prompt函数,Native会拦截prompt事件,然后执行
                ret = prompt("_dsbridge=" + method, arg);
            }
 
            return  JSON.parse(ret||'{}').data
        },
        // 原生Native调用的方法使用此方法注册
        register: function (name, fun, asyn) {
            //注册的方法会保存到_dsaf或_dsf中
            var q = asyn ? window._dsaf : window._dsf
            
            //object类型保存到_obs下,方法直接保存到_dsf(_dsaf)下
            if (typeof fun == "object") {
                q._obs[name] = fun;
            } else {
                q[name] = fun
            }
        }
};
  • Native---->JS核心:以下是源码缩减版本~
//立即执行函数
!function () {
    //判断是否需要给window进行参数添加,如果没有添加会把ob内参数进行一次添加
    if (window._dsf) return;
    
    var ob = {
        _dsf: {//存储同步方法
            _obs: {}//存储同步方法相关object
        },

        _dsaf: {//存储异步方法
            _obs: {}//存储异步方法相关object
        },

        dscb: 0,//避免方法同名每次加1
        dsBridge: bridge, 

        _handleMessageFromNative: function (info) { //处理Native调用js方法,核心实现如下
            // 通过info.method 获取方法实现
           var f = this._dsf[info.method];

            // 通过info.data 获取入参,数组形式
            var arg = JSON.parse(info.data);

            // 使用apply函数,调用函数
            f.apply(ob, arg)
        } //end
    } // var ob end

}//func end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改taro-ui-vue3的tabs组件源码增加数字标签

需求&#xff1a;taro-ui-vue3的tabs组件上增加数字标记 步骤一&#xff1a;node_modules文件夹下找到taro-ui-vue3/lib/tabs/index.js 把173行的这一段替换成下面这段&#xff0c;然后写上样式 default: () > item.number ? [h(View, {class: at-tabs__item_in}, {defau…

maven3.9的settings.xml 内容学习

settings.xml 文件介绍 settings.xml 是 Maven 的配置文件&#xff0c;它允许你自定义 Maven 的行为&#xff0c;比如设置仓库、代理、认证信息等。在 Maven 3.9 中&#xff0c;settings.xml 的结构和内容可能与之前的版本相似&#xff0c;但可能会有一些小的改进或变化。下面…

经典文献阅读之--RaLF(激光雷达地图中基于流的全局和度量雷达定位)

0. 简介 激光雷达地图中基于流的全局和度量雷达定位。自主机器人的定位是至关重要的。尽管基于相机和激光雷达的方法已经得到大量研究&#xff0c;但是它们会受到恶劣的光照和天气条件的影响。因此&#xff0c;最近雷达传感器由于其对这种条件固有的鲁棒性而受到关注。在《RaL…

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果

linux应急响应基础命令

一、cpu使用率-top top -c -o %CPU -c 显示进程的命令行参数 -o 按照CPU占用从大到小排序二、用户信息 1、查看系统所有用户信息 [rootcentos7 ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nol…

FlexLua低代码技术,十分钟搞定4G转LoRa网关设备

在当今物联网时代&#xff0c;无线通信技术的发展日新月异&#xff0c;4G和LoRa作为两种不同的通信技术&#xff0c;各自拥有独特的优势和应用场景。而4G转LoRa网关设备的出现&#xff0c;则将这两种技术有效地结合起来&#xff0c;为物联网应用提供了更多可能性。 4G转LoRa网关…

室内设计师必备的免费3D模型网站,赶紧收藏!

3D模型已经成为室内设计师的重要工具。它们不仅能够帮助设计师更好地理解和呈现他们的设计概念&#xff0c;还能够提高工作效率&#xff0c;减少错误和修改的次数。然而&#xff0c;许多高质量的3D模型都需要付费购买&#xff0c;那么室内设计师必备的免费3D模型网站有哪些? 首…

探索C# 11与.NET 7:入门指南与跨平台开发

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

SpringBoot整合支付宝入门

支付宝支付 对接流程 申请阿里支付官方企业账号配置应用签约产品获取RSAKey&#xff08;非对称加密&#xff09;必须获得两个加密串&#xff1a;一个公钥&#xff0c;一个密钥SDK功能开发业务对接支付回调支付组件 核心所需的参数 APPID商家私钥支付宝公钥支付回调地址网关…

Backend - Django Swagger

目录 一、安装依赖 二、配置环境 三、路由&#xff08;urls&#xff09; 四、swagger UI 界面 &#xff08;一&#xff09;UI 界面 &#xff08;二&#xff09;单引号问题&#xff1a;Expecting property name enclosed in double quotes 1. 原因 2. 解决 五、自定义s…

【技能拾遗】——Markdown+Typora/VSCode与LaTeX的使用

&#x1f4d6; 前言&#xff1a;Markdown 是一种轻量型标记语言&#xff0c;是一种语法. 以 .md 结尾的文本文件就是 Markdown 文件。 相较于 Word&#xff0c;它更加像是 HTML 语言或是 LaTeX \LaTeX LATE​X&#xff0c;并不是最淳朴的那种"所见即所得"。 它处处透…

RTX 腾讯通停止服务,有哪些平滑升级迁移替代方案?

RTX腾讯通&#xff0c;作为腾讯公司于2003年推出的企业即时通讯软件&#xff0c;曾经在政企单位中得到广泛应用。然而&#xff0c;自2015年后&#xff0c;这款软件就未曾更新&#xff0c;近期腾讯将RTX腾讯通官网的域名更改为跳转到企业微信官网&#xff0c;这意味RTX腾讯通正式…

AGI的智力有可能在两年内超过人类水平

特斯拉CEO埃隆马斯克近日与挪威银行投资管理基金CEO坦根的访谈中表示&#xff0c;AGI的智力将在两年内可能超过人类智力&#xff0c;在未来五年内&#xff0c;AI的能力很可能超过所有人类。 马斯克透漏&#xff0c;去年人工智能发展过程中的主要制约因素是缺少高性能芯片&#…

Leetcode-移除链表元素

203. 移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&…

一张图教你看懂亚马逊云科技的超过200个云服务

亚马逊云科技&#xff08;AWS&#xff09;是业界服务种类最全面的☁️厂商&#xff0c;目前有超过200种服务&#xff0c;那这么多服务能否一次性把他们都记住呢&#xff1f; 小李哥给大家带来一张AWS 200项服务列表&#xff0c;大家一眼就能看懂这些服务的使用场景。欢迎大家在…

【HarmonyOS 4+NEXT】开发工具安装指南

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;开发工具安装 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS4NEXT&#xff1a;探索未来智能生态新纪元 文章目录 前言准备工作下载开发工具安装开发工具配置开发环境总结 前言 随着科技的不断进步&#xff0c;智能设…

硬阈值什么意思?

硬阈值是一种非线性函数&#xff0c;常用于信号处理和数据压缩中的阈值处理。具体来说&#xff0c;硬阈值将输入信号中小于或等于给定阈值的值设为零&#xff0c;而大于阈值的值保持不变。数学表示如下&#xff1a; Hard(x, T) { 0, if |x| ≤ T; x, if |x| > T } 其中&a…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

芯洲SCT55610三相栅极驱动器,打造高效无刷直流电机系统

近年来的&#xff0c;无刷直流电机&#xff08;Brushless DC Motor, BLDC&#xff09;在工业、汽车、家电、医疗器械等各个领域得到广泛应用。相对于传统有刷电机&#xff0c;BLDC电机具有以下优势&#xff1a;高效率、寿命长、低噪音、小型化和精确控制。这些优势使得BLDC电机…

Springboot集成Ehcache3实现本地缓存

如果只需要在单个应用程序中使用本地缓存&#xff0c;则可以选择Ehcache&#xff1b;它支持内存和磁盘存储&#xff0c;这里不以注解方式演示&#xff0c;通过自己实现缓存管理者灵活控制缓存的读写&#xff1b; 1、引入相关依赖 <!-- ehcache3集成start --><depende…