預先定義好schema,如myapp://... 經過前端發送僞鏈接請求iframe.src前端
var iframe = document.createElement('iframe')
iframe.style.display = 'none'
iframe.src = schema
var body = document.body
body.appendChild(iframe)
setTimeout(function () {
body.removeChild(iframe)
iframe = null
})
複製代碼
能夠看到,在某個按鈕或者行爲須要與原生端通訊時建立一個iframe而後再移除,若是不移除iframe,則會在body裏出現大量無用的iframe標籤,這裏簡單說一下Native怎麼去攔截這個僞連接請求。 在WebviewClient裏override一個方法:vue
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(SCHEMA)) {
...
return true;
}
}
複製代碼
實際項目中,確定是要傳遞參數給Native接收的,能夠對這樣封裝java
for (key in data) {
if (data.hasOwnProperty(key)) {
schema += '&' + key + data[key]
}
}
複製代碼
這樣就能夠拼接出&key=value這種形式,Native端能夠寫一個方法獲取到key和value的值而後去作相應的處理。android
有的時候bridge事件處理完以後須要告訴前端一些消息回饋,那麼前端須要封裝一個callbackName傳給Native端webpack
var callbackName = ''
if (typeof callback === 'string') {
callbackName = callback
} else {
callbackName = action + Date.now()
console.log('callbackName: ' + callbackName)
window[callbackName] = callback
}
schema += 'callback=' + callbackName
複製代碼
特別注意:這裏有一個Date.now(),做用是爲了不回調方法重複,且避免在ios手機上不斷點擊形成界面阻塞UI失去響應。ios
Native端執行回調寫法:web
public static void call(WebView webview, String js) {
if (webview != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webview.evaluateJavascript(js, null);
} else {
webview.loadUrl("javacript:" + js);
}
}
}
複製代碼
jsbrige封裝完畢後,能夠測試,以分享爲例:前端工程化
window.bridge.share({
title: '...',
content: '...'
}, function (result) {
if (result.success) {
alert('分享成功')
}
})
複製代碼
只需載入brige.js便可bash
import './bridge'
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
new Vue({
render: h => h(App)
}).$mount('#app')
複製代碼