目录

一、概念了解:

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){}
})
    ```

四、完整流程图

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

  1. webview之JSB通信原理

    1.前言 在这个移动互联网盛行的时代,移动应用的开发就需求量剧增,早期的移动端应用大都使用原生开发(android,ios),而现在的移动开发技术选型上基本都是混合开发(Hybrid),混合开发是一种 ...

  2. grpc通信原理_gRPC原理简析

    gRPC原理简析 gRPC是由谷歌提出并开发的RPC协议,gRPC提供了一套机制,使得应用程序之间可以进行通信. 降级开发者的使用门槛,屏蔽网络协议,调用对端的接口就像是调用本地的函数一样.而gRPC ...

  3. 试简述smtp通信的三个阶段的过程_通信原理简答题汇总

    模拟调制的主要方式有哪些,他们各有什么优点和缺点 AM调制:优点是接收设备简单:缺点是功率利用率低,抗干扰能力差,信号带宽较宽,频带利用率不高.因此,AM制式用于通信质量要求不高的场合,目前主要用在中 ...

  4. jsbridge实现及原理_一篇文章了解 JsBridge

    一.jsbridge 定义 JSBridge 是一种 JS 实现的 Bridge,连接着桥两端的 Native 和 H5.它在 APP 内方便地让 Native 调用 JS,JS 调用 Native ...

  5. Java中高级核心知识全面解析——Redis(集群【概述{主从复制、哨兵、集群化}、数据分区方案、节点通信机制、数据结构简析】)5

    目录 一.[集群]入门实践教程 1.Redis 集群概述 1)Redis 主从复制 2)Redis 哨兵 3)Redis 集群化 2.主从复制 1)主从复制主要的作用 2)快速体验 ①.第一步:本地启 ...

  6. JSBridge通信原理

    JSBridge是个啥 直接来重点,记住:JSBridge 是一个很简单的东西,更多的是一种形式.一种思想,为了解决 H5 和 Native 的双向通信. 就像我们刚接触 ajax 时,也很懵逼.其实 ...

  7. uni-app H5使用web-view父子之间的相互传值

    uni-app H5使用web-view父子之间的相互传值 遇到的问题: uni-app页面代码 web-view(HTML页面),子组件接收父组件数据,子组件传值给父组件 遇到的问题: uni-ap ...

  8. html 如何实现一条竖线边上有 刻度_Android H5交互Webview实现localStorage数据存储

    先看看效果图吧-- 实现比较简单,但是第一次用可能会遇到一些坑 首先得有Webview控件: 有人问我是不是需要写布局文件,不写行不行,现在我就告诉你们,不写没问题,需要写就写不写直接创建New一个也 ...

  9. Android开发笔记(一百六十六)H5通过WebView录像上传

    前面的博文< Android开发笔记(一百五十二)H5通过WebView上传图片>介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页.既然如此,那么再探讨一下如何实现这个摄像上传 ...

最新文章

  1. python中一些常用函数和库的介绍(getattr、id、type、sys)
  2. 基于SSM的e律通管理系统
  3. 修改pom文件_SpringCloud微服务全家桶-第8篇,服务的配置文件更改
  4. [bzoj3143] [HNOI2013]游走
  5. Juqery让世界更美好--超级简单实用的(上、下)自动翻的最佳效果,有图为证!...
  6. parkAndCheckInterrupt
  7. 解析JVM内存区域组成
  8. Samba服务器(一):windows访问samba服务器共享文件的简单实现(图文并茂)
  9. Java线程的一些api
  10. ACM题目中输入数据的处理(C++语言版)
  11. leetcode 46 Permutations ----- java
  12. python的设计哲学_Python的设计哲学--zen of Python
  13. 多径瑞利信道的一种matlab产生方法
  14. 系列学习 Lambda 表达式之第 2 篇 —— JDK1.8 的 Stream 流基本使用
  15. modelica学习
  16. 命名空间“Microsoft”中不存在类型或命名空间名“AspNet”(是否缺少程序集引用?)
  17. ShareKitnbsp;中SHK.m中的编译错…
  18. 英语发音之音标4---长元音法()
  19. matlab求心率变异性的程序,心率变异性及其相关算法的实现
  20. tps和tips区别_性能测试:TPS和QPS的区别

热门文章

  1. Proe Creo 二次开发之模型装配--获得装配约束
  2. ROS(Noetic)学习笔记 创建机器人URDF模型并在rviz中显示过程中遇到的一些问题
  3. 面试不慌,拿这70张思维导图,怒怼面试官
  4. Java 8 辣么大(lambda)表达式不慌之—–(三)Consumer
  5. cakephp oracle,CakePHP入门(8)-创建Model
  6. 推荐一个非常优秀的学术资源网诺贝尔学术资源网(以供分享)
  7. [Linux][RK3399] 以太网调试 — 利用 ping 和 pathping 工具
  8. win10如何开启ClearType文本
  9. linux 文件修复工具,Linux环境下几个好用的文件恢复工具
  10. 中国移动:以改革为动力 促进科技创新发展