记忆的时间差
记忆的时间差
  • 发布:2021-01-28 14:34
  • 更新:2021-04-04 16:04
  • 阅读:6992

uniapp向webview中发送消息

分类:uni-app

uniapp向webview中发送消息

在业务开发中,使用webview嵌套了vue开发的h5页面,进行套壳打包,其一需求是,在h5中获取当前app的版本号,就涉及到了uniapp向webview传递消息的场景

uniapp 中代码

核心为获取到webview窗口,然后通过evalJS执行h5中的方法

  • setVersion方法为h5页面中定义的全局方法
<template>  
    <view class="content">  
        <!-- 开发 -->  
        <web-view @message="onMessage" :webview-styles="webviewStyles" src="http://192.168.1.158:3000"></web-view>  

    </view>  
</template>  
<script>  
export default {  
    data() {  
        return {  
            title: 'Hello',  
            webviewStyles: {  
                progress: {  
                    color: '#f0b90b'  
                }  
            },  
            wv: null,  
        };  
    },  
    onLoad() {  
        const self = this;  
        // #ifdef APP-PLUS  
        let currentWebview = this.$scope.$getAppWebview();  
        setTimeout(function() {  
            let wv = currentWebview.children()[0];  
            self.wv = wv;  
            self.setVersion();  
        }, 1000);  
        // #endif  

    },  
    methods: {  
        // 设置版本号  
        setVersion() {  
            const self = this;  
            plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {  
                self.wv.evalJS("setVersion('" + widgetInfo.version + "')");  
            });  
        },  
        // 接收消息  
        onMessage(e) {  
            const self = this;  
            console.log('我收到了网页发来的消息', e.detail.data);  
            let data = e.detail.data;  
        },  
    }  
};  
</script>  

h5 中代码

App.vue

// 设置版本号  
    window.setVersion = (id) => {  
      localStorage.setItem("version", version);  
    };

然后就可以在h5中获取使用了

注意

尽量不要uni生命周期中直接调用h5里面的方法,要等h5加载完成后,才可以调用

1 关注 分享
DCloud_iOS_XHY

要回复文章请先登录注册

伊卡28

伊卡28

大佬好,想请教一个问题。
如果H5页面本身会调用layer的plus对象,然后被嵌套在webview中,业务需要从webview向app传递消息,所以create webview的时候 plusrequire用的默认值,plus冲突了之后,怎么解决比较好呢?
2021-04-04 16:04
5***@qq.com

5***@qq.com

大佬你好我用的是plus.runtime.openWeb,获取到了webview,向你一样在H5项目中定义了function,然后在evalJS中调用,然后就报错了
Script error.
filename:
lineno:0
2021-04-04 15:38
s***@qq.com

s***@qq.com

小程序里怎么向webview里发送数据
2021-03-23 18:57
czj1993

czj1993

可以调用,但是打开相机或者相册后,调用h5无效,大佬知道是什么原因吗
2021-03-23 18:47
1***@qq.com

1***@qq.com

回复 阿宁啊 :
let wv = currentWebview; 这行 改成 let wv = currentWebview.children()[0];
2021-03-06 16:58
记忆的时间差

记忆的时间差 (作者)

回复 阿宁啊 :
vue 中不用ref,直接用this.$scope.$getAppWebview()就可以,nvue中要用ref获取元素
2021-02-04 19:36
阿宁啊

阿宁啊

回复 记忆的时间差 :
好的,谢谢你,我找到问题了,是我的webview窗口没有获取到,不知道是不是nvue的问题,还是什么问题,我在webview上加了一个refs,获取到后就能用evalJs了,像这样
```
<web-view refs="wv"></web-view>

this.$refs.wv.evalJs(`uniResolve(1)`)
```
2021-02-04 18:45
记忆的时间差

记忆的时间差 (作者)

回复 记忆的时间差 :
html内可以写个事件,html加载完成后,通知uni加载完成,这个时候可以就可以调用html内的方法了
2021-02-04 18:08
记忆的时间差

记忆的时间差 (作者)

回复 阿宁啊 :
你的代码没问题,是获取时机的问题

本地html加载完成后,uni内才可以调用html里面的方法

你定时器写了一个延时3秒肯定不行的,你写一个事件触发,或者延时改为10秒就可以了
2021-02-04 18:07
阿宁啊

阿宁啊

回复 记忆的时间差 :
模拟的场景大概是从本地上传完视频后将接口返回的结果给到h5那边的页面
2021-02-04 16:57