c***@163.com
c***@163.com
  • 发布:2023-09-12 09:09
  • 更新:2023-09-12 15:50
  • 阅读:244

【紧急求助】客户用uni-app开发的应用,我们是基于vue的h5页面,我们的页面嵌入到客户的uni应用中。

分类:uni-app

【紧急求助可付费】客户用uni-app开发的应用,我们是基于vue的h5页面,我们的页面嵌入到客户的uni应用中。
请问这样嵌入后,我们页面中能调用uni-app的sdk方法吗?能调用自定义插件吗?十分感谢。可提供咨询费

2023-09-12 09:09 负责人:无 分享
已邀请:
喜欢技术的前端

喜欢技术的前端 - QQ---445849201

需要在你vue页面引入这个js  
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>  

这些是可以直接用的,  
uni.navigateTo   
uni.redirectTo        
uni.reLaunch       
uni.switchTab      
uni.navigateBack       

uni.postMessage 向应用发送消息 可以在web-view  页面调用app里面的方法  
BoredApe

BoredApe - 有问题就会有答案。

我正在写相关文章,到时候把链接给你

BoredApe

BoredApe - 有问题就会有答案。

主要组成部分和步骤

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__JSBridgeactionchooseImage,并提供一个回调函数名chooseImageCallBack

然后,定义chooseImageCallBack函数,该函数将在app完成图片选择后被调用,并接收选择的图片数据。

4、 JSBridge方法处理chooseImage动作
JSBridge方法接收到actionchooseImage的消息时,它将调用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)})

要回复问题请先登录注册