JSBridge的原理

375 阅读2分钟

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-参数和回调的格式