uniapp小程序与H5之间的通信

发布时间 2023-12-06 16:28:41作者: 90一代

一、小程序端向H5传递参数

这个比较简单,就是利用web-view的src传递就行

1、创建承载web-view的.vue页面,代码如下:

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

<script>
    import {
        mapGetters
    } from "vuex"
    import qs from "qs"
    export default {
        data() {
            return {
                src: ""
            }
        },
        computed: {
            ...mapGetters(['user', 'school', 'token', 'school_token'])
        },
        onLoad(option) {
            // decodeURI避免中文乱码,
            this.src = "xxxxxxx?" + decodeURI(qs.stringify({
                isView: 'true',
                school: this.school,
                token: this.token,
                school_token: this.school_token,
                user: this.user
            }))
        },
    }
</script>

2、H5接收参数

我是在App.vue页面获取的参数,可以把获取的参数缓存起来,看自己业务去

1     import qs from "qs"
2         onLaunch: function() {
3             console.log('App Launch')
4             const obj = qs.parse(window.location.href.split('?')[1]) || null;
5             if (obj && Object.keys(obj).length > 0) {
6             //如果有参数就对参数进行处理,但是有一点需要注意,如果传递过来的对象,最后一个属性值是字符串,后面值会自己跟一个  #/ ,具体为啥不知道,没有去找原因,反正我接收到的参数值是这样的,(我也是第一次用qs序列化参数,url拼接的是一个对象这样传参)
7             }
8         },

二、H5向小程序端传递参数

 这一块是真的坑,需要注意一下!!!!

1、下载uni sdk

下载uni sdk的路径,需要将这个文件下载到项目中,我是命名为uni.webview.js,并放在static文件夹下

1 <script src="https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.3.js"></script>

2、修改uni.webview.js文件

默认自带的方法名为uni,会和本地的uni命名冲突。会报uni.postMessage不是一个function

我改成了webUni。注意修改的地方有三处(我之前只改了一处,结果一直整不出来)

 

 

3、修改index.html文件

在public下的index.html文件中添加如下代码,注意要放在<body></body>后面

 1     <script type="text/javascript">
 2         var userAgent = navigator.userAgent;
 3         if (userAgent.indexOf('AlipayClient') > -1) {
 4             // 支付宝小程序的 JS-SDK 防止 404 需要动态加载,如果不需要兼容支付宝小程序,则无需引用此 JS 文件。
 5             document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');
 6         } else if (/QQ/i.test(userAgent) && /miniProgram/i.test(userAgent)) {
 7             // QQ 小程序
 8             document.write(
 9                 '<script type="text/javascript" src="https://qqq.gtimg.cn/miniprogram/webview_jssdk/qqjssdk-1.0.0.js"><\/script>'
10             );
11         } else if (/miniProgram/i.test(userAgent) && /micromessenger/i.test(userAgent)) {
12             // 微信小程序 JS-SDK 如果不需要兼容微信小程序,则无需引用此 JS 文件。
13             document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');
14         } else if (/toutiaomicroapp/i.test(userAgent)) {
15             // 头条小程序 JS-SDK 如果不需要兼容头条小程序,则无需引用此 JS 文件。
16             document.write(
17                 '<script type="text/javascript" src="https://s3.pstatp.com/toutiao/tmajssdk/jssdk-1.0.1.js"><\/script>');
18         } else if (/swan/i.test(userAgent)) {
19             // 百度小程序 JS-SDK 如果不需要兼容百度小程序,则无需引用此 JS 文件。
20             document.write(
21                 '<script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.18.js"><\/script>'
22             );
23         } else if (/quickapp/i.test(userAgent)) {
24             // quickapp
25             document.write('<script type="text/javascript" src="https://quickapp/jssdk.webview.min.js"><\/script>');
26         }
27     </script>
28 
29     <!--上面的都是copy uni-app web-view组件官方的案例,懒得再去删减修改了 -->
30 
31     <!-- uni 的 SDK -->
32     <script type="text/javascript" src="<%= BASE_URL %>static/uni.webview.js"></script>
33     <script type="text/javascript">
34         // 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
35         document.addEventListener('UniAppJSBridgeReady', function() {
36             webUni.getEnv(function(res) {
37                 console.log('当前环境:' + JSON.stringify(res));
38             });
39         });
40     </script>

4、使用uni.webview的方法

使用webUni.postMessage()发送消息,可以通过点击事件向小程序发送消息,还可以使用方法跳转到小程序

 1             changeSchoolHandle() {
 2             //如果想要点击按钮后,小程序退出H5页面,那么就在postMessage前进行路由跳转,具体支持的路由跳转方法,可以查看官方文档,
 3                     webUni.reLaunch({
 4                         url: '/pages/school/school'
 5                     })
 6                     webUni.postMessage({
 7                         data: {
 8                             type: 'backSchool'
 9                         }
10                     })
11             },
1 //webView中使用@message对消息进行处理
2 <web-view :src="src" @message="handleMessage"></web-view>

注意:

1、postMessage() 里,数据要放在 data 对象里

2、注意触发的时机,只有 后退、组件销毁、分享 的时候,才会触发 web-view 的message事件

3、使用uni的 方法,要改uni.webview.js里的 uni 对象。此处我改为了webUni