原生APP跳转到H5页面时,每每须要携带一些用户信息,以前作法是在跳转的地址中拼接H5页面须要的参数,如今经过window.WebViewJavascriptBridge悄悄的进行数据交互。javascript
下面从H5的角度记录交互思路:java
1:安卓环境和ios环境稍微有点不一样,须要根据navigator.userAgent判断一下当前环境android
2:仍然是APP环境不一样,安卓须要进行兼容性判断,若是不存在window.WebViewJavascriptBridge变量,须要手动添加Dom的WebViewJavascriptBridgeReady事件监听;
ios一样须要判断是否存在window.WebViewJavascriptBridge变量,若是不存在继续判断window.WVJBCallbacks变量,若是仍然不存在,则手动赋值为H5回调,而后document.createElement('iframe')插入document中,随即移除。ios
3:以上处理完成后,经过WebViewJavascriptBridge变量来注册【事件】以便APP能监听到并执行相应操做app
4:3中须要对安卓系统进行init处理,若是是安卓系统,注册事件以前须要先调用WebViewJavascriptBridge.init()dom
方法(注意: 一个页面整个生命周期过程当中,只能进行一次init()不然会报错,个人作法是经过一个全局变量来判断是否初始化过)测试
//针对安卓和ios系统,对window.WebViewJavascriptBridge进行兼容性处理 function setupWebViewJavascriptBridge(callback) { var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 if (isAndroid) { if (window.WebViewJavascriptBridge) { callback(WebViewJavascriptBridge) } else { //添加dom事件 document.addEventListener( 'WebViewJavascriptBridgeReady', function () { callback(WebViewJavascriptBridge) }, false ); } } if (isiOS) { console.log('isiOS') if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); } if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); } window.WVJBCallbacks = [callback]; var WVJBIframe = document.createElement('iframe'); WVJBIframe.style.display = 'none'; WVJBIframe.src = 'https://__bridge_loaded__'; document.documentElement.appendChild(WVJBIframe); setTimeout(function () { document.documentElement.removeChild(WVJBIframe) }, 0) } }
//封装方法,key:跟原生定义好的要捕获的名称, callback:原生捕获后执行的回调,此处能够写H5的后续执行方法,params:对象,要传给原生的参数 var setupWebViewBridge = function (key, callback, params) { setupWebViewJavascriptBridge(function (bridge) { var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 //本身定义的全局变量,用来判断当前页面中安卓系统是否进行过一次初始化,页面卸载时取消赋值 if (!window.hadCalledWindow_WebViewJavascriptBridge ) { if (isAndroid) { window.hadCalledWindow_WebViewJavascriptBridge = true bridge.init(function (message, responseCallback) { console.log('JS got a message', message); var data = { 'Javascript Responds': '测试中文!' }; if (responseCallback) { console.log('JS responding with', data); responseCallback(data); } }); } } bridge.callHandler( key, //安卓系统必须传一个参数,不然捕获不到,所以,默认传入一个_x_变量 JSON.stringify({ ...params, _x_: 1, }), callback ); }) }
原生APP里,注册要捕获的方法: spa
bridge.registerHandler('jsbridge_showMessage', function (data, responseCallback) { showResponse(data); });