在实际项目之中,常常会遇到app之中嵌入网页的状况(Hybrid),就须要web网页与原生app之间交互,好比获取当前用户信息等。一种简单的方式就是经过url参数来搞定,可是这种方式异常死板,因此有了jsbridge。
本文章旨在记录WebViewJavascriptBridge的实现,若有错误,还请指正!若有须要了解jsbridge原理,请google。ios
需求:web
/** * 函数描述:js调用webview事件 * * jsBridge.callHandler(method, data, callBack(response)); * @param method {string} 方法名 * @param data {Object} 参数 * @return {Object} 回调 */ /** * 函数描述:webView调用JS事件 * * jsBridge.registerHandler(method, callBack(response)); * @param method {string} 方法名 * @return {Object} 回调 */
const JsBridge = { init: function (callback) { const u = navigator.userAgent; const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //判断手机系统 if (!isiOS) { //ios if (window.WebViewJavascriptBridge) { callback(WebViewJavascriptBridge) } else { // 注册事件,WebViewJavascriptBridge加载完成时调用 document.addEventListener( 'WebViewJavascriptBridgeReady', function () { callback(WebViewJavascriptBridge) }, false ); } } else { //Android // 若是有WebViewJavascriptBridge,则直接返回callback if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); } // 若是有WVJBCallbacks,则向WVJBCallbacks中注入事件 if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); } // 不然建立WVJBCallbacks window.WVJBCallbacks = [callback]; const WVJBIframe = document.createElement('iframe'); WVJBIframe.style.display = 'none'; WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__'; document.documentElement.appendChild(WVJBIframe); setTimeout(function () { document.documentElement.removeChild(WVJBIframe) }, 0) } }, first: function () { const u = navigator.userAgent; const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); if (!isiOS) { const _this = this; _this.init(function (bridge) { bridge.init(function (message, responseCallback) { responseCallback(data); }) }) } }, registerHandler: function (name, fun) { const _this = this; _this.init(function (bridge) { bridge.registerHandler(name, fun); }) }, callHandler: function (name, data, fun) { const _this = this; _this.init(function (bridge) { bridge.callHandler(name, data, fun); }) } } // 初始化 JsBridge.first();