uniapp APP中内嵌webview的H5与APP相互通讯动态传参代码示例

 更新时间:2024年04月02日 09:16:58   作者:夕溯流光  
最近外部公司的app要接入我司的uni H5项目,所以这篇文章主要给大家介绍了关于uniapp APP中内嵌webview的H5与APP相互通讯动态传参的相关资料,需要的朋友可以参考下

概要

在使用uni-app开发app的过程中使用到公司其他项目h5的页面,app项目中使用了web-view来进行内嵌,h5项目中核心功能是调用扫一扫进行扫码,由于h5本身基于微信开发,可以直接调用 this.$wx.scanQRCode()实现扫一扫功能,但通过web-view嵌入app中,无法使用微信环境,导致直接调用摄像头失败,点击没有反应。

思路

后面看到web-view可以跟应用进行交互,于是想到从这里入手应该可以解决。h5调用app中的uni.scanCode(),拿到结果后回传h5内,即实现了app内嵌h5的扫码需求。

代码

1.因为h5需要向app发送事件,所以需要引入对应的webview.js文件。这是基础。uniapp官方文档下载uni.webview.1.5.4.js到本地,在h5项目的main.js中全局引入

h5的main.js

// #ifdef H5
// 引入uni.webview.1.5.4.js
import '@/mixin/uni.webview.1.5.4.js';
// #endif

2.在h5页面 methods调用uni.webView.postMessage向app传参,mounted 里通过使用监听app中使用的evalJs()方法接收app传过来的参数,

h5的index.vue

  mounted() {
  //document.addEventListener() 方法用于向文档添加事件句柄,即事件监听。当相应的事件发生了,就执行对应的函数。
            document.addEventListener("getAppMsg", (e) => {
                //webview接收uniapp传过来的信息
                console.log('getAppMsg', e.detail.code)
            }, false)
        },
 methods: {
            testScan() {
               //h5向app传参,触发事件
                uni.webView.postMessage({
                    data: {
                        action: 'scanCode',
                    }
                })
            }
            }

3.app的内嵌webview页面中,在 的 message 事件回调event.detail.data中接收H5发送给App的信息;通过拿到webview的内部对象,去调用系统的evalJS方法,传入字符串,将该方法内部的字符串在webview的H5中当做js代码去执行。

app的scanCode.vue

//template
   <web-view :src="src" @message="message"></web-view>

//script
onLoad() {
            
            let height = 0; //定义动态的高度变量
            let statusbar = 0; // 动态状态栏高度
            uni.getSystemInfo({ // 获取当前设备的具体信息
                success: (sysinfo) => {
                    statusbar = sysinfo.statusBarHeight + 55;
                    height = sysinfo.windowHeight - 65;
                    console.log("高度", statusbar, height)
                }
            });
            // #ifdef APP-PLUS
            let currentWebview = this.$mp.page.$getAppWebview(); //获取当前web-view 
            let that = this
            setTimeout(function() {
                that.wv = currentWebview.children()[0];
                that.wv.setStyle({ //设置web-view距离顶部的距离以及自己的高度,单位为px
                    top: statusbar, //此处是距离顶部的高度,应该是你页面的头部
                    height: height, //webview的高度
                })
            }, 200); //如页面初始化调用需要写延迟
            // #endif
        },
  methods: {
            message(e) {
                //接收H5发送给app的消息      
                // e.detail.data即为H5中uni.webView.postMessage()的data的内容
                let mesg = e.detail.data[0]
                console.log("mesg", mesg)
                if (mesg.action == "scanCode") {
                    // 允许从相机和相册扫码
                    uni.scanCode({
                        onlyFromCamera: true, //只允许通过相机扫码
                        scanType: ['qrCode'], //调起条码扫描
                        autoDecodeCharset: true,
                        success: (res) => {
                            console.log(`res=${res.result}`) //res.result为扫码结果
                            this.wv.evalJS( 
  "document.dispatchEvent(new CustomEvent('getAppMsg',{detail: {code:" +JSON.stringify(res.result) + "}}))"
                            )
          //通过evalJS(),传入方法字符串,将该方法内部的字符串在webview的H5中当做js代码去执行。
          //document.dispatchEvent()为创建自定义事件在h5中执行
            							}
            							})
            		}
            }
       }

至此,完成了app与h5之间的动态传参通信

总结

到此这篇关于uniapp APP中内嵌webview的H5与APP相互通讯动态传参的文章就介绍到这了,更多相关uniapp APP中H5与APP动态传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue+echarts封装气泡图的方法

    vue+echarts封装气泡图的方法

    这篇文章主要为大家详细介绍了vue+echarts封装气泡图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Vue.js实现一个漂亮、灵活、可复用的提示组件示例

    Vue.js实现一个漂亮、灵活、可复用的提示组件示例

    这篇文章主要介绍了Vue.js实现一个漂亮、灵活、可复用的提示组件示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Vue项目首屏性能优化组件实战指南

    Vue项目首屏性能优化组件实战指南

    Vue众所周知是一个轻量级的框架,源码仅仅为72.9KB,但是也有它自己的缺点,就是首屏加载会比较慢,这篇文章主要给大家介绍了关于Vue项目首屏性能优化组件的相关资料,需要的朋友可以参考下
    2021-11-11
  • Vue项目每次发版后要清理浏览器缓存问题解决办法

    Vue项目每次发版后要清理浏览器缓存问题解决办法

    最近项目更新频繁,每次一更新客户都说还跟之前的一样,一查原因是因为客户没有清空浏览器的缓存,所以为了方便客户看到最新版本,开始调研再发布新版本后自动清理缓存,这篇文章主要给大家介绍了关于Vue项目每次发版后要清理浏览器缓存问题的解决办法,需要的朋友可以参考下
    2024-02-02
  • vue使用xlsx导入到表格中示例代码

    vue使用xlsx导入到表格中示例代码

    这篇文章主要介绍了vue使用xlsx导入到表格中代码,具体实现是先通过FileReader将上传的文件读取为二进制数据,然后使用xlsx将它解析成JSON数据,最后将JSON数据填充到表格中,需要的朋友可以参考下
    2023-11-11
  • vue项目使用定时器每隔几秒运行一次某方法代码实例

    vue项目使用定时器每隔几秒运行一次某方法代码实例

    有时候在项目中我们经常需要设置简单的倒计时功能,这个可以通过定时器来实现,下面这篇文章主要给大家介绍了关于vue项目使用定时器每隔几秒运行一次某方法的相关资料,需要的朋友可以参考下
    2023-04-04
  • vue.js表单验证插件(vee-validate)的使用教程详解

    vue.js表单验证插件(vee-validate)的使用教程详解

    这篇文章主要介绍了vue.js表单验证插件(vee-validate)的使用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • vue中轮训器的使用

    vue中轮训器的使用

    今天小编就为大家分享一篇关于vue中轮训器的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 如何解决ElementPlus的el-table底白线问题

    如何解决ElementPlus的el-table底白线问题

    这篇文章主要介绍了如何解决ElementPlus的el-table底白线问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 如何正确快速使用Vue中的插槽和配置代理

    如何正确快速使用Vue中的插槽和配置代理

    这篇文章主要介绍了正确快速使用Vue中的插槽和配置代理的相关知识,插槽分为三种,分别是默认插槽、具名插槽、作用域插槽,下面分别列出了如何使用这三种插槽,需要的朋友可以参考下
    2023-01-01

最新评论