主要组成部分和步骤
1、 定义web-view:
<web-view :src="webviewAllUrl" @onPostMessage="getH5Message" @message="getH5Message" ></web-view>
2、处理web-view消息:
当getH5Message
方法被触发时,它将调用JSBridge
方法,并传递从web-view接收到的数据。
getH5Message(bridgeData) {
JSBridge(bridgeData);
}
3、 使用JSBridge方法:
当web-view内的页面需要与app进行交互时,例如选择图片,它可以使用以下代码:
uni.webView.postMessage({
data: {
type: '__JSBridge',
action: 'chooseImage',
callBackFn: 'chooseImageCallBack',
},
});
window.chooseImageCallBack = function(data) {
resolve(JSON.parse(data));
};
上述代码首先通过uni.webView.postMessage
方法发送一个消息给app,指定type
为__JSBridge
,action
为chooseImage
,并提供一个回调函数名chooseImageCallBack
。
然后,定义chooseImageCallBack
函数,该函数将在app完成图片选择后被调用,并接收选择的图片数据。
4、 JSBridge方法处理chooseImage动作:
当JSBridge
方法接收到action
为chooseImage
的消息时,它将调用uni-app的chooseImage
方法来让用户选择图片。选择完成后,使用web-view的evalJS
方法来调用web-view内的页面的chooseImageCallBack
函数,并传递选择的图片数据。
//原生插件
const xxxModule = uni.requireNativePlugin('xxxModule');
const pages = getCurrentPages();
const page = pages[pages.length - 1].$getAppWebview().children()[0];
switch (action) {
// uni方法
case 'chooseImage':
uni.chooseImage({
success({ tempFilePaths }) {
console.log(' :>>>>>>>>>>>> jsBridge.js:14', tempFilePaths);
page.evalJS(`${callBackFn}('${JSON.stringify({ tempFilePaths })}')`);
},
});
break;
//原生插件方法
case 'selectXXX':
xxxModule.invoiceImport(JSON.stringify(params), result => page.evalJS(`${callBackFn}('${result}')`));
break;
default:
break;
}
当然你可以让你客户直接写一个jsBridge注入到webview中,这样你就可以全局调用。
const pages = getCurrentPages();
const childPage = pages[pages.length - 1].$getAppWebview().children()[0];
childPage.setJsFile('_www/static/js/xxx.min.js');
//xxx.min.js内容
function postMessageToApp(action, callbackName, params) {
// 检查uni对象和uni.webView是否存在
if (!uni || !uni.webView || typeof uni.webView.postMessage !== 'function') {
console.error('uni.webView.postMessage is not available.');
return;
}
// 检查动作和回调名称
if (!action || !callbackName) {
console.error('Invalid action or callback name.');
return;
}
uni.webView.postMessage({
data: {
type: '__JSBridge',
action,
callBackFn: callbackName,
params,
},
});
}
export function chooseImage() {
return new Promise((resolve) => {
const callbackName = 'chooseImageCallBack';
window[callbackName] = function(data) {
console.log('data from chooseImage:', data);
resolve(JSON.parse(data));
};
postMessageToApp('chooseImage', callbackName);
});
}
export function scanCode() {
return new Promise((resolve) => {
const callbackName = 'scanCodeCallBack';
window[callbackName] = function(data) {
console.log('data from scanCode:', data);
resolve(data);
};
postMessageToApp('scanCode', callbackName);
});
}
export function selectFile(mimeType) {
return new Promise((resolve) => {
const callbackName = 'selectFileCallBack';
window[callbackName] = function(data) {
console.log('data from selectFile:', data);
resolve(data);
};
postMessageToApp('selectFile', callbackName, mimeType);
});
}
webview中调用方法:
xxx.chooseImage().then(e=>{console.log(e)})
3 个回复
喜欢技术的前端 - QQ---445849201
BoredApe - 有问题就会有答案。
我正在写相关文章,到时候把链接给你
BoredApe - 有问题就会有答案。
主要组成部分和步骤
1、 定义web-view:
2、处理web-view消息:
当
getH5Message
方法被触发时,它将调用JSBridge
方法,并传递从web-view接收到的数据。3、 使用JSBridge方法:
当web-view内的页面需要与app进行交互时,例如选择图片,它可以使用以下代码:
上述代码首先通过
uni.webView.postMessage
方法发送一个消息给app,指定type
为__JSBridge
,action
为chooseImage
,并提供一个回调函数名chooseImageCallBack
。然后,定义
chooseImageCallBack
函数,该函数将在app完成图片选择后被调用,并接收选择的图片数据。4、 JSBridge方法处理chooseImage动作:
当
JSBridge
方法接收到action
为chooseImage
的消息时,它将调用uni-app的chooseImage
方法来让用户选择图片。选择完成后,使用web-view的evalJS
方法来调用web-view内的页面的chooseImageCallBack
函数,并传递选择的图片数据。当然你可以让你客户直接写一个jsBridge注入到webview中,这样你就可以全局调用。
webview中调用方法: