整个流程就是Native和Js两端各准备一个bridge,Native的bridge提供modules,js的bridge注册Native提供的modules。这就是bridge存在的意义–提供一个桥梁,让两边通信。
简单来说,只需要两步,第一简历桥连接,第二注册方法:
1 | function setupWebViewJavascriptBridge(callback) { |
兼容安卓ios
1 | if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { //ios |
Android 初次加载是需要初始化
1 | bridge.init(function(message, responseCallback) {responseCallback(data)}); |
h5调用native
iOS在setupWebViewJavascriptBridge里注册
android在connectWebViewJavascriptBridge里注册
1 | bridge.callHandler(funcName, data, callback); |
native调用js
1 | bridge.registerHandler(funcName, function(responseData, responseCallback) { |
概念
1、H5,即是html5,超文本标记语言,用于描述网页内容结构的语言,网页编程中由它有负责描述页面数据和信息
2、JS,即是JavaScript,广泛用于web应用开发中的脚本语言,负责响应用户的操作,为网页添加动态功能
3、native APP,即传统的原生APP开发模式,Android基于Java语言,底层调用Google的 API;iOS基于Objective-C或者Swift语言,底层调用App官方提供的API
4、Hybrid App,即原生和web的混合开发模式,由原生提供统一的API给js调用,实现跨平台的效果
交互方式
- 第一种为H5与native的基本通讯方式
说是基本通讯方式是因为由native自身的组件进行通讯的,这里需要区分为android和iOS,两端的组件实现有差异
基本通讯方式汇总
- iOS通过官方提供的库文件JaveScriptCore来实现交互,可以脱离webview直接运行js
- android是通过addJavascriptInterface开放统一的api给js调用,实现交互,但具有安全性问题,版本4.2之前addJavascriptInterface接口引起安全漏洞,可被反编译获取Native注册的js对象,在页面通过反射Java的内置静态类,获取一些敏感的信息和破坏。
- 第二种H5与native交互方式为JSBridge原理
JSBridge是H5代码与native代码之间的一个通讯桥梁,是广为流行的交互理念。目前的统一实现流程是:H5触发url scheme–>native捕获url scheme–>原生分析并执行–>原生调用H5,如下图:
URL scheme,是一个URL最初始的位置,即://之前的那段字符,如baidu.com的scheme为http;根据我们上面对URL scheme的使用,我们可以理解,H5通过某种方式如iframe触发scheme,然后Native用某种方法捕获对应的url触发事件,根据定义好的协议,分析当前触发了哪种方法,然后根据定义来执行。比如短信,就是sms:,比如微信,就是weixin
所以JSBridge交互本质就是通过webview的代理拦截url scheme,然后注入相应的JS,从而实现交互,目前我们公司使用的是第三方开源库WebViewJavascriptBridge,下面我们来讲讲这个通讯桥梁。
实现流程
- 首先在H5代码注入js代码块
1 | function setupFH5JsBridge(callback) { |
or
我们项目里是这样:
1 | function nativeApp() { |
- JS端使用方式
native端需要进行注册对应的方法,H5才可以调用
Android注册方式如下:
1 | FH5JsBridge.registerHandler(bridgeWebView, handlerName, bridgeHandler); |
iOS端注册方式如下
1 | /*** @param registerHandler 要注册的事件名称 |
H5调用方式如下
1 | FH5JsBridge.callHandler(methodName, 方法名options,对象 callback) |
H5常见的调用方法
打开native 页面,从H5页面跳转到某个原生页面
1
void openAppPage(data,callback) --data 为{pageName:''}
获取会话token,H5登录区内的操作需获取原生的登录态
1
void getSSOTicket(data,callback)
刷新会话,在一定的时间内刷新会话
1
void refreshSession(data,callback)
打开原生App的安全键盘
1
void openSafeKeyboard(data,callback)
打开分享,微信QQ等分享
1
void share(data,callback)
设置临时存储数据,H5需要存储native的数据作为临时数据,退出APP后,临时数据清空
1
2void setData(data, callback)
data 格式为{key:"key", value: string }获取临时存储数据,获取临时存储的数据进行使用
1
2void getData(data, callback)
data 格式为{key:"key"}删除临时存储数据
1
2void removeData(data, callback)
data格式为{key:"key"}
加载过程
加载和互相调用