H5嵌⼊APP后,原⽣APP与H5之间交互原⽣APP跳转到H5页⾯时,往往需要携带⼀些⽤户信息,之前做法是在跳转的地址中拼接H5页⾯需要的参数,现在通过
window.WebViewJavascriptBridge悄悄的进⾏数据交互。
本⽂主要从H5的⾓度记录交互思路:
1:安卓环境和ios环境稍微有点不同,需要根据navigator.userAgent判断⼀下当前环境
2:仍然是APP环境不同,安卓需要进⾏兼容性判断,如果不存在window.WebViewJavascriptBridge变量,需要⼿动添加Dom的WebViewJavascriptBridgeReady事件监听;ios同样需要判断是否存在window.WebViewJavascriptBridge变量,如果不存在继续判断window.WVJBCallbacks变量,如果仍然不存在,则⼿动赋值为H5回调,然后ateElement('iframe')插⼊document中,随即移除。
3:以上处理完成后,通过WebViewJavascriptBridge变量来注册【事件】以便APP能监听到并执⾏相应操作
4:3中需要对安卓系统进⾏init处理,如果是安卓系统,注册事件之前需要先调⽤WebViewJavascriptBridge.init()
⽅法(注意:⼀个页⾯整个⽣命周期过程中,只能进⾏⼀次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
);
}
}
原生安卓app开发if (isiOS) {
console.log('isiOS')
if (window.WebViewJavascriptBridge) {
return callback(WebViewJavascriptBridge);
}
if (window.WVJBCallbacks) {
return window.WVJBCallbacks.push(callback);
}
window.WVJBCallbacks = [callback];
var WVJBIframe = ateElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = '__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function () {
veChild(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⾥,注册要捕获的⽅法:
showResponse(data);
});
移动端混合开发,需要原⽣与h5交互。
⽬前接触过的两种⽅法:
1. ⼤多数是直接通过webview代理,理解的是通过拦截调⽤与原⽣进⾏交互。任意版本都⽀持。
2. 使⽤第三⽅库WebViewJavaScriptBridge。
这⾥主要整理下WebViewJavaScriptBridge在前端部分的使⽤:
【⽤于 WKWebView & UIWebView 中 OC 和 JS 交互(ios)】
注册监听事件(固定代码):
/*这段代码是固定的,必须要放到js中*/
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = ateElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = '__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { veChild(WVJBIframe) }, 0)
js与原⽣⽅法调⽤部分
//添加原⽣调起js⽅法
setupWebViewJavascriptBridge(function(bridge) {
/* Initialize your app here */
//所有与iOS交互的JS代码放这⾥!
//js注册⽅法让原⽣调起(原⽣调⽤js)
/
/name:和原⽣约定的调⽤⽅法名
//function(data,callback):调⽤⽅法的具体内容,data为原⽣传过来的参数,callback为js给原⽣的回调函数
alert("do sth with"+data)
responseCallback("js calls back to oc");
});
//js唤起原⽣注册的⽅法(js调⽤原⽣)
//name:和原⽣约定的调⽤⽅法名
//data:向原⽣传递的参数
//function:原⽣调⽤后的回调函数(回调结果处理)
bridge.callHandler('ocFunction',data,function(res){
alert("js has received the result:"+res);
});
}
备注:
传送的数据格式,ios端可以是JSon对象,android端是string
setupWebViewJavascriptBridge⽅法使⽤即执⾏(原⽣初始化页⾯时即调起)
完整(ios+Android部分):
例⼦
搜集整理,如有侵权,必删
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论