项目的快速迭代过程中,APP中嵌入H5页面已是很常见的做法。
一定会有APP和JS的交互场景,例如JS唤起APP并携带参数...
// 不带参
window.location.href = 'https://xxx.focus.cn/backtoapp'
// 带参
window.location.href = 'https://xxx.focus.cn/backtoapp?data=xxx'
存在的问题:
本质上,它是通过webview
的代理拦截scheme
,然后注入相应的JS
。
webkit MessageHandler
原理同 WebViewJavascriptBridge
本库主要使用 WebViewJavascriptBridge
和 webkit MessageHandler
进行封装。
WebViewJavascriptBridge
和 webkit MessageHandler
原理: H5页面 <--> Native App
执行被调用Native
代码返回调用结果(H5页面执行被调用JavaScript代码并返回调用结果)
封装 bridge.js。
index.html中使用:
<button id="btn">模拟调用登录带参数和回调</button>
index.js中使用:
require('/path/to/bridge.js');
// 需要和客户端同学提前约定好相互调用的方法名及参数及回调,包裹所需要用到的函数
HFWVBridge.wrapNativeFn(['login']);
document.getElementById('btn').onclick = function() {
// Android端如果使用 messageHandlers 方式,HFWVBridge 即可;
// 如果没有而是使用 WebViewJavascriptBridge ,则使用 window.WebViewJavascriptBridge.callHandler
if (isFocusAppIOS()) {
HFWVBridge.runNative('login', {
name: '搜狐网友'
}, function() {
alert('欢迎来到搜狐');
})
} else {
/**
*
* @desc 方式一:发送消息给app
* @param {Any} 发送的消息
* @param {Function} 发送消息给app后的的回调,且能拿到app返回的数据
*/
var data = {id: 1, content: "这是一个图片 <img src=\"a.png\"/> test\r\nhahaha"};
window.WebViewJavascriptBridge.send(
data
, function(responseData) {
document.getElementById("show").innerHTML = "repsonseData from java, data = " + responseData
}
);
/**
*
* @desc 方式二:调用app的方法
* @param {String} 与客户端事先约定好的调用方法名
* @param {Object} 调用app方法的传参
* @param {Function} 调用app方法的的回调,且能拿到app返回的数据
*/
window.WebViewJavascriptBridge.callHandler(
'submitFromWeb'
, {'param': '中文测试'}
, function(responseData) {
document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
}
);
}
};
HFWVBridge.add('hideBtn',function(){
document.getElementById('btn').style.display = 'none';
});