H5和native利用JSBridge交互,其中涉及到了一些和ios交互的callHandler框架,WebViewJavascriptBridge相关的原理还待补充…
一.基本用法使用
bridge文件
bridge文件是原生调用native的基础,大致需要这么几步完成: 1.建立AppClient对象
function AppClient(appObj, isAndroid) {
this.appObj = appObj;
this.isAndroid = isAndroid;
};
2.建立js文件调用native的方法
AppClient.prototype.closePage = function() {
if (this.isAndroid) {
this.appObj.closePageAction();
} else {
this.appObj.callHandler("closePageAction");
}
}
注:closePage()就是js文件调用native关闭页面的方法,“closePageAction"是native端暴露给js端关闭 页面的操作。
js调用文件
1.init AppClient对象
if(window.android) {
appClient = new AppClient(window.android, true);
// 此处可以调用一些init的方法
} else {
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
setupWebViewJavascriptBridge(function(bridge) {
appClient = new AppClient(bridge, false);
// 此处可以调用一些init的方法
});
}
2.调用,依旧closePage()为例:
appClient.closePage();
二.重点
数据
1.native存在多线程,所以在js端h5页面在获取接口数据时,需要设置ajax异步(以jQuery为例:async:true) 2.js实现异步的几种途径: (1) 在异步获取数据成功之后,再去继续下一步操作,以jQuery为例: 在success回调函数里面,执行接下来的操作
$.ajax({
headers: {
Accept: "application/json; charset=utf-8",
basicParams: JSON.stringify(appData),
},
url:staticUrl + url,
type:'POST',
dataType:"json",
data: params,
async:true,
cache:false,
contentType:'application/json',
processData:false,
success:function(data){
// 你的下一步操作
},
error:function(data){
console.log("---出现错误---"+ JSON.stringify(data));
}
});
(2)ES6原生提供的Promise对象,将异步操作以同步操作的流程表达出来
var promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success 你的下一步操作
}, function(value) {
// failure
});
js端调用native需要native回传数据
1.定义native回调js端的函数 (1)invokeJsPassCompanyCodeAndName()即native调用js的函数,必须放在window全局对象下, 否则native可能会调不到; (2)ios端利用callHandler框架回传的数据只能是json对象的形式
window.invokeJsPassCompanyCodeAndName = function(_params) {
companyCode = _params.companyCode;
companyName = _params.companyName;
var jsonStr = "";
getSign(jsonStr);
}
2.js端调用native
appClient.getSignedParams("jsDataAction", jsDataAction, ajaxRequestStr);
注:三个参数(callbackName, callback, params)回调函数名称,回调函数,给native传的参数
3.bridge文件
AppClient.prototype.getSignedParams = function (callbackName, callback, jsonStr) {
var dataParams = "";
if(isJson(jsonStr)){
dataParams = JSON.parse(jsonStr);
}
var iOSData = {
from: 'H5',
params: dataParams
};
if (this.isAndroid) {
this.appObj.getSignedParamsAction('H5', jsonStr);
} else {
this.appObj.callHandler("getSignedParamsAction", iOSData, callback);
}
};
注:利用callHandler给native传参数时,iOSData必须是一个json对象
最后, 希望大家早日实现:成为编程高手的伟大梦想!
欢迎交流~