JSBridge

517 阅读1分钟

hybrid存在的意义

1. 可以快速迭代开发
2. 体验流畅
3. 减少开发成本,双端共用一套代码

webview

webview是app的一个组件,用来加载h5页面,即一个小型的浏览器内核

JS和客户端通信的基本形式

JS访问客户端能力,传递参数和回调函数
客户端通过回调函数返回内容

手写一个JsBridege

var jwl
!function(e, n) {
    n(e)
}(window, function(e) {
// 不用理解都是调用开源的WebViewJavascriptBridge
function setupWebViewJavascriptBridge(callback) {
    if (e.WebViewJavascriptBridge) {
      return callback(e.WebViewJavascriptBridge);
    }
    if (e.WVJBCallbacks) {
      return e.WVJBCallbacks.push(callback);
    }
    e.WVJBCallbacks = [callback];

    var iframe = doc.createElement('iframe');
    iframe.style.display = 'none';
    iframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    doc.documentElement.appendChild(iframe);
    setTimeout(function() {
      doc.documentElement.removeChild(iframe)
    }, 0)
  }
  // 不用理解都是调用开源的WebViewJavascriptBridge
  function invoke(fun, params, cb) {
    if (!params) params = {}
    setupWebViewJavascriptBridge(function(bridge) {
      bridge.callHandler(fun, params, function(res) {
        cb && cb(res)
      })
    })
  }
  
  var doc = e.document,
    ua = navigator.userAgent.toLowerCase(),
    isAndroid = -1 != ua.indexOf("android"),
    isIOS = -1 != ua.indexOf("iphone") || -1 != ua.indexOf("ipad"),
    apiList = {
        isAndroid,
        isIOS,
        // 显示右上角菜单
        showOptionMenu: function(e) {
          invoke('showOptionMenu', {
            menuList: e.menuList
          })
        },
    }
  return apiList    
})

JS调用

// 显示app菜单
jwl.showOptionMenu({
  menuList: [
    'menuItem:share:appMessage',
    'menuItem:share:timeline',
    'menuItem:refresh'
  ]
})