JSBridge
原理
JSBridge
很早就出现在软件开发中,在一些桌面软件中很早就运用了这样的形式,多用在通知、产品详情、广告等模块中,然后这些模块中,使用的是Web UI
,而相关按钮点击后,调用的是Native
功能。现在移动端盛行,不管是Hybrid
应用,还是React-Native
都离不开JSBridge
,当然也包括在国内举足轻重的微信小程序。
bridge [brɪdʒ] 桥;桥牌
1 JSBridge
的起源
主要的原因还是因为JavaScript
主要载体Web
是当前世界上的最易编写 、 最易维护 、最易部署的UI
构建方式。工程师可以用很简单的 HTML
标签和CSS
样式快速的构建出一个页面,并且在服务端部署后,用户不需要主动更新,就能看到最新的UI
展现。
开发维护成本和更新成本较低的Web
技术成为混合开发中几乎不二的选择,而作为Web
技术逻辑核心的JavaScript
也理所应当肩负起与其他技术『桥接』的职责,并且作为移动不可缺少的一部分,任何一个移动操作系统中都包含可运行JavaScript
的容器,例如WebView
和JSCore
。所以,运行JavaScript
不用像运行其他语言时,要额外添加运行环境。因此,基于上面种种原因,JSBridge
应运而生。
移动端混合开发中的JSBridge
,主要被应用在两种形式的技术方案上:
- 基于
Web
的Hybrid
解决方案:例如微信浏览器、各公司的Hybrid
方案 - 非基于
Web UI
但业务逻辑基于JavaScript
的解决方案:例如React-Native
微信小程序基于Web UI
,但是为了追求运行效率,对UI
展现逻辑和业务逻辑的JavaScript
进行了隔离。因此小程序的技术方案介于上面描述的两种方式之间。
2 JSBridge
的用途
JSBridge
就像其名称中的Bridge
的意义一样,是Native
和非Native
之间的桥梁,它的核心是构建Native
和非Native
间消息通信的通道,而且是双向通信的通道。 简单来讲,主要是给JavaScript
提供调用Native
功能的接口,让混合开发中的前端部分可以方便地使用地址位置、摄像头甚至支付等Native
功能。
双向通信的通道:
JS
向Native
发送消息:调用相关功能、通知Native
当前JS
的相关状态等。Native
向JS
发送消息:回溯调用结果、消息推送、通知JS
当前Native
的状态等。
3 JSBridge
的实现原理
JavaScript
是运行在一个单独的JS Context
中(例如,WebView
的Webkit
引擎、JSCore
)。由于这些Context
与原生运行环境的天然隔离,我们可以将这种情况与RPC
(Remote Procedure Call
,远程过程调用)通信进行类比,将Native
与JavaScript
的每次互相调用看做一次RPC
调用。
remote [rɪˈmoʊt] 边远的 procedure [prəˈsiːdʒər] 手续,步骤
在JSBridge
的设计中,可以把前端看做RPC
的客户端,把Native
端看做RPC
的服务器端,从而JSBridge
要实现的主要逻辑就出现了:通信调用(Native
与JS
通信)和句柄解析调用。
4 JSBridge
的通信原理
4.1 JavaScript
调用Native
JavaScript
调用Native
的方式,主要有两种:注入API
和拦截URL SCHEME
。
4.1.1 注入API
注入API
方式的主要原理是,通过WebView
提供的接口,向JavaScript
的Context
(window
)中注入对象或者方法,让JavaScript
调用时,直接执行相应Native
代码逻辑,达到JavaScript
调用Native
的目的。
https://blog.csdn.net/xingyu19911016/article/details/121293421 2.1相关内容
在Android 4.2
之前,Android
注入JavaScript
对象的接口是addJavascriptInterface
,但是这个接口有漏洞,可以被不法分子利用,危害用户的安全,因此在Android 4.2
中引入新的接口@JavascriptInterface
(上面代码中使用的)来替代这个接口,解决安全问题。所以Android
注入对对象的方式是有兼容性问题的。
4.1.2 拦截URL SCHEME
URL SCHEME
是一种类似于url
的链接,是为了方便APP
直接互相调用设计的,形式和普通的url
近似,主要区别是protocol
和host
一般是自定义的,例如:qunarhy://hy/url?url=ymfe.tech
,protocol
是qunarhy
,host
则是hy
。
拦截URL SCHEME
的主要流程是:Web
端通过某种方式(例如iframe.src
)发送URL SCHEME
请求,通过shouldOverrideUrlLoading
来拦截约定规则的url
https://blog.csdn.net/xingyu19911016/article/details/121293421 2.2相关内容
在时间过程中,这种方式有一定的缺陷:
- 发送
URL SCHEME
会有url
长度的隐患。 - 创建请求,需要一定的耗时,比注入
API
的方式调用同样的功能,耗时会较长。
4.2 Native
调用JavaScript
https://blog.csdn.net/xingyu19911016/article/details/121293421 1相关内容
5 JsBridge
的优点
JavaScript
端可以确定JSBridge
的存在,直接调用即可H5
同时适配Android
和iOS
两个平台java
与js
的交互存在一些安全漏洞
参考
https://juejin.cn/post/6844903585268891662#heading-0