JSB实现原理
实现JSBridge主要是两点:
- 将Native端原生接口封装成JS接口
- 将Web端JS接口封装成原生接口
Native--->Web
Native端调用Web端,通过解释器执行一段JS代码,将拼接的JS代码字符串,传入JS解析器执行。JS解析器就是webVie w.
Web--->Native
web调用Native端主要有两种方式
第一种方法:拦截Webview请求的URL Schema
Native加载WebView之后,web发送的所有请求会经过web view组件,做判断 - 如果符合自定义的Url Schema,对URL进行解析操作,调用Native的方法 - 不符合,直接转发,请求真正的服务 web发送URL请求的方法有4种
- a标签
- location.href
- 使用iframe.src
- 发送ajax请求
第二种方法:向Webview中注入JS API
通过webview提供的接口,APP将Native的相关接口注入到JS的window对象中,(对象内的方法名与Native相关的方法名会相同的),web端就可以直接在全局window下使用暴露的全局JS对象,调用原生端的方法
JSBridge是Native代码与JS代码的通信桥梁。目前的一种统一方案是:H5触发url scheme->Native捕获url scheme->原生分析,执行->原生调用h5。
实现思路
- 第一步:设计出一个Native与JS交互的全局桥对象
- 第二步:JS调用Native
- 第三步:Native如何得知api被调用
- 第四步:分析url-参数和回调的格式
- 第五步:Native如何调用JS
- 第六步:H5中API方法的注册以及格式
解析思路
第一步:设计一个Native与JS交互的全局桥对象
JS和Native之间的通信必须通过一个H5全局对象JSBridge来实现
- 该对象名为“JSBridge”,是H5页面中全局对象window的一个属性
var JSBridge = window.JSBridge || (window.JSBridge = ())
第二步:JS如何调用Native
可以通过它的callHandler方法调用原生的。
callHandler函数内部实现过程
- 判断是否有回调函数,有,生成一个回调函数id,并将ID和对应回调添加进入回调函数集合responseCallbacks中
- 通过特定的刹那火速转换方法,将传入的数据,方法名一起,拼接成一个url scheme
- 使用内部创建好的一个隐藏iframe触发scheme
第三步:Native如何得知api被调用
根据系统不同,Android和iOS分别有自己的处理方式
在Android中,通过shouldoverrideurlloading 可以捕获到url scheme触发 在iOS中,通过delegate函数在Native层得到通知,原理是利用shouldStartLoadWithRequest
第四步:分析URL-参数和回调的格式