Hybrid与h5使用webview+JSBridge实现通信原理简析

目录

一、概念了解:

webview - 承载和渲染网页的容器

JSBridge - 封装(了一系列js与native互通数据)的js方法

二、简易流程图:

三、详解流程:

第一步: 设计出一个Native与JS交互的全局桥对象

 第二步: JS调用Native功能实现-callHandler 内部实现

第三步: Native监听api调用,捕获这个url

第四步: Native分析url-api名、回调和参数的格式

第五步: Native调用JS功能实现

第六步: H5中api方法的注册 - H5页面中注册供原生调用的API 

四、完整流程图


方式:采用native + h5

一句话总结:App 安装后都会在手机上注册一个 schema ,比如淘宝是 taobal://,native 会有一个进程远程监控 webview发出的所有 schema://请求,然后分发到各 api(即协议名称),native 处理时会用到传入的 param参数,处理结束后再调用webview window 对象中的 callback

Js 调用 native:app 实现对webview URL 的观察者模式,h5通过改变 url 的哈希值,app 会解析哈希值的变化去执行相应操作

Native 与 h5通信:将 js 对象绑定到 webview 的 window 对象上,app 通过原生方法调用 window 中的 js 方法

一、概念了解:

Url schema

通常用于声明式调用,页面间的跳转

App 安装后都会在手机上注册一个 schema ,比如淘宝是 taobal://


webview - 承载和渲染网页的容器


native也可以对webview进行定制,修改和扩展js执行环境的宿主对象,拦截webview发起的请求、控制缓存等功能。通过这些能力,能实现js与native之前信息互通

JSBridge - 封装(了一系列js与native互通数据)的js方法

常见交互如下:
* native重写弹窗行为,如alert、promt、confirm等
* URL schema

二、简易流程图:

三、详解流程:


第一步: 设计出一个Native与JS交互的全局桥对象

window.JSBridge  = JSBridge


    该对象中包含三个方法:
    registerHandler(String handlerName, Function handler):供H5调用,用来注册natvie可以调用的js方法,然后保存到本地变量messageHandlers中。

    callHandler( String handlerName, JSON data, Function callback):供H5调用,h5调用native 原生api,调用后用url schema触发,然后将callback的id放到本地变量responseCallbacks中。

    _handleMessageFromNative( JSON ):供native调用,native调用h5的方法,或者通知h5执行回调,(h5调用原生方法时 将回调函数作为参数传递,也就是responseCallbacks中的回调函数)



 

 第二步: JS调用Native功能实现-callHandler 内部实现


    1. 使用判断h5调用该方法的时候有没有回调函数,如果有,则生成一个回调函数id,并将id和对应的回调函数添加进回调函数的集合responseCallbacks中 

  if (cb_fun) {
              window[cb_value] = function (res) {
                    if (typeof res == 'string') res = JSON.parse(res);
                        console.log('['+tagname+'返回]', res)
                       cb_fun(res);
              }
        }


    2.将传入的方法名、数据等拼接成一个url schema

    

var time = new Date().getTime();
var cb_key = (options.tagname == 'getSysDeviceInfo' || options.tagname == 'getLoginInfo') ? 'callBack' : 'callback';
var cb_value = (options.callbackname) ? options.callbackname : 'hybrid_' + time;
var schema = options.schema;
var tagname = options.tagname;
var cb_fun = options.callback;
var param = options.param;
var url = schema || 'kkhybrid';
url += '://' + tagname + '?t=' + time; //时间戳,防止url不起效
url += (cb_fun) ? '&' + cb_key + '=' + cb_value : '';


3.使用location.href跳转触发shcema

 window.location = url;

第三步: Native监听api调用,捕获这个url

第四步: Native分析url-api名、回调和参数的格式


        1.根据api名找出对应的原生方法, 并记录方法回调完成后的id
        2.对提取出来的参数进行转化
        3.原生调用此api
        4.执行完成后找到此api对应的回调id整合成一个json参数
        5.native通过JSBridge通知js页面回调

第五步: Native调用JS功能实现

 JSBridge._handleMessageFromNative(messageJSON);


第六步: H5中api方法的注册 - H5页面中注册供原生调用的API
 

   //注册一个测试函数
    JSBridge.registerHandler('testH5Func',function(data,callback){
        alert('测试函数接收到数据:'+JSON.stringify(data));
        callback&&callback('测试回传数据...');
    });


例:
kkmh.requestHybrid({
    tagName: ‘’,
    callback: function(res){}
})
    ```

四、完整流程图


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在H5页面中使用JSBridgeAPP通信时,需要先在APP端注入一个JSBridge对象,然后在H5页面中通过该对象调用APP提供的方法。下面是具体的实现步骤: 1. 在APP端注册一个JSBridge对象,并注入到WebView中。这里以Android为例,示例代码如下: ```java WebView webView = findViewById(R.id.web_view); WebViewJavascriptBridge bridge = new WebViewJavascriptBridge(webView, new BridgeHandler() { @Override public void handler(String data, CallBackFunction function) { // 处理H5页面发送过来的数据 } }); bridge.registerHandler("test", new BridgeHandler() { @Override public void handler(String data, CallBackFunction function) { // 处理H5页面发送过来的test数据 } }); ``` 其中,WebViewJavascriptBridge是一个封装了WebViewJSBridge的类,BridgeHandler是一个处理JSBridge消息的接口,CallBackFunction是一个回调函数,用于将结果返回给H5页面。在这个示例中,我们注册了一个名为"test"的方法,并在其中处理从H5页面发送过来的数据。 2. 在H5页面中引入WebViewJavascriptBridge.js文件,并在页面加载完毕后初始化JSBridge对象。示例代码如下: ```javascript <script src="WebViewJavascriptBridge.js"></script> <script> // 初始化JSBridge对象 var bridge = new WebViewJavascriptBridge(function(message, responseCallback) { // 处理APP端发送过来的数据 }); // 发送数据给APP端 bridge.send('Hello from H5!'); // 调用APP端提供的方法 bridge.callHandler('test', {'data': 'Hello from H5!'}, function(response) { // 处理APP端返回的结果 }); </script> ``` 在这个示例中,我们初始化了一个JSBridge对象,并发送了一条消息给APP端。同时,我们还调用了APP端提供的名为"test"的方法,并将包含"data"字段的JSON对象作为参数传递给了APP端。当APP端处理完这个方法后,会将结果返回给H5页面,并通过回调函数处理这个结果。 通过上述步骤,就可以在H5页面中使用JSBridgeAPP端进行通信了。需要注意的是,JSBridge实现方式可能因平台和版本而异,具体实现方式需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值