高德打车对接loader.js文件的实现
一、因为我们接入高德打车h5功能,所以就需要实现js交互,对于js交互我们选择了使用第三方框架WebViewJavascriptBridge(这个框架两端引入方式不同)。
二、高德对接时候给了一个loader.js文件,里面的功能有待于我们自己去完善。
三、废话不多说了,直接(loader.js)代码实现部分
const u = navigator.userAgent;
const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
//iOS端异步引入WebViewJavascriptBridge
function getIOSBridge(callback) {
return new Promise(resolve => {
if (window.WebViewJavascriptBridge) { return resolve(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(resolve); }
window.WVJBCallbacks = [resolve];
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)
}).then(callback)
}
//安卓端异步引入WebViewJavascriptBridge
function getAndroidBridge(callback) {
return new Promise(resolve => {
function initBridge() {
window.WebViewJavascriptBridge.init(function (message, responseCallback) {
console.log('JS got a message', message);
var datas = {
'Javascript Responds': '测试中文!'
};
console.log('JS responding with', datas);
responseCallback(datas);
});
}
if (window.WebViewJavascriptBridge) {
initBridge()
resolve()
} else {
document.addEventListener('WebViewJavascriptBridgeReady', function () {
initBridge()
resolve()
}, false);
}
}).then(callback)
}
//iOS和安卓端异步引入WebViewJavascriptBridge框架方法整合
async function getBridge(callback) {
if (isAndroid) {
await getAndroidBridge(callback)
} else if (isiOS) {
await getIOSBridge(callback)
}
}
;(function (window) {
function loadJSBridge(main) {
class JSBridge {
constructor() {
const self = this;
return function JSBFn(opts, cb) {
if (self[this]) {
self[this](opts, cb);
}
}
}
/**
* 获取当前定位
* @param {Object} opts
* - [String] bizType 标识当前应用类型,目前值为 'amap',如无需使用请忽略
* @param {Function} cb 回调函数
* @回调函数参数 {Object}
* - [String | null] error 标识异常信息,获取定位成功时应为 null
* - [Number] longitude 经度,保留小数点后 6 位
* - [Number] latitude 纬度,保留小数点后 6 位
*/
getCurrentLocation(opts, cb) {
// @todo
WebViewJavascriptBridge.callHandler('getCurrentLocation', "", function (response) {
if (isAndroid) {
response = JSON.parse(response);
}
// logger.info(LogTag.loader, 'getCurrentLocation result', response)
cb(response);
});
}
/**
* 开启持续定位
* @param {Object} opts
* - {Number} callbackInterval 获取定位的时间间隔
* @param {Function} cb 回调函数,开启持续定位后,应定时回调此方法
* @回调函数参数 {Object}
* - [String | null] error 标识异常信息,获取定位成功时应为 null
* - [Number] longitude 经度,保留小数点后 6 位
* - [Number] latitude 纬度,保留小数点后 6 位
*/
startContinuousLocation(opts, cb) {
// @todo
const { callbackInterval = 5000 } = opts;
this.continuousLocationTimr = window.setInterval(() => {
this.getCurrentLocation({}, cb);
}, callbackInterval);
}
/**
* 停止持续定位
* @param {Function} cb 回调函数,无需参数
*/
stopContinuousLocation(cb) {
// @todo
clearInterval(this.continuousLocationTimr);
this.continuousLocationTimr = null;
}
/**
* 获取设备号,安卓手机提供IMEI MEID,苹果手机提供IDFA,如果部分机型获取不到一律传空字符串,
* 不可以是 invalid 等标识字符串
* @param {Function} cb 回调函数
* @回调函数参数 {String} 设备号
*/
getDeviceId(cb) {
// @todo
WebViewJavascriptBridge.callHandler('getDeviceId', "", function (response) {
cb(response);
});
}
/**
* 设置导航栏标题
* @param {Object} opts
* - {String} title 导航栏标题
*/
setTitle(opts) {
// @todo
WebViewJavascriptBridge.callHandler('setTitle', opts['title'], function (response) {
cb(response);
});
}
/**
* 复制到剪切板
* @param {Object} opts
* - {String} text 需要复制的文本内容
*/
setClipboard(param) {
console.log(param)
// @todo
WebViewJavascriptBridge.callHandler('copyclipboard', param, function (response) {
});
}
/**
* 关闭当前 webview
*/
popWindow() {
// @todo
WebViewJavascriptBridge.callHandler('popWindow', '', function (response) {
});
}
/**
* 打开新的 webview
* @param {Object} opts
* - {String} url 新页面链接
* - {Object} param 参数
* - {String} defaultTitle: 新页面标题
*/
pushWindow(opts) {
// @todo
WebViewJavascriptBridge.callHandler('pushWindow', opts, function (response) {
});
}
/**
* 获取系统信息
* @param {Function} cb 回调函数
*/
getSystemInfo(cb) {
// @todo
WebViewJavascriptBridge.callHandler('getSystemInfo', "", function (response) {
if (isAndroid) {
response = JSON.parse(response);
}
cb(response);
});
}
/**
* 禁止手势返回
* @param {Object} opts
* - {Boolean} val 手势返回开启状态 true 为允许返回,false 为禁止返回
*/
setGestureBack(opts) {
// @todo
WebViewJavascriptBridge.callHandler('setGestureBack', opts['val'], function (response) {
});
}
/**
* 隐藏导航栏
*/
hideTopBar() {
// @todo
WebViewJavascriptBridge.callHandler('hideTopBar', '', function (response) {
});
}
/**
* 调起支付收银台
* @param {Object} opts
* - {String} orderStr 支付宝支付交易字符串
* @param {Function} cb 回调函数
* @回调函数参数 {Object}
* - {Number|String} resultCode 支付宝返回的 code
* - {String} memo 错误描述
*/
tradePay(opts, cb) {
// @todo
WebViewJavascriptBridge.callHandler('alipay', opts['orderStr'], function (response) {
if (isAndroid) {
response = JSON.parse(response);
}
cb(response);
});
}
}
window.JSBridge = new JSBridge();
getBridge(main)
}
window.loadJSBridge = loadJSBridge;
loadJSBridge(()=>{
console.log('加载成功')
})
})(window);
决定你人生上限的,不是能力,而是做人做事的格局。你的能力决定你能得到什么,而你的格局,却会决定你最终能走到哪里。我不怀疑你的能力,但我不看好你的人品。

浙公网安备 33010602011771号