当前位置:   article > 正文

微信小程序webview和小程序通讯_微信小程序和webview通信

微信小程序和webview通信

1.背景介绍

1.1需要在小程序嵌入vr页面,同时在vr页面添加操作按钮与小程序进行通信交互

1.2 开发工具:uniapp开发小程序

1.3原型图

        功能:.点击体验官带看跳转小程序的体验官带看页面

         功能:点击立即咨询唤起小程序弹窗打电话

2.组件及api介绍

uniapp官网:web-view | uni-app官网 (dcloud.net.cn)

web-view

web-view 是一个 web 浏览器组件,可以用来承载网页的容器,会自动铺满整个页面(nvue 使用需要手动指定宽高)。

各小程序平台,web-view 加载的 url 需要在后台配置域名白名单,包括内部再次 iframe 内嵌的其他 url 。

属性说明

属性名类型说明平台差异说明
srcStringwebview 指向网页的链接
allowString用于为 iframe 指定其特征策略H5
sandboxString该属性对呈现在 iframe 框架中的内容启用一些额外的限制条件。H5
fullscreenBoolean是否铺满整个页面,默认值:trueH5 (HBuilder X 3.5.4+)
webview-stylesObjectwebview 的样式App-vue
update-titleBoolean是否自动更新当前页面标题。默认值:trueApp-vue (HBuilder X 3.3.8+)
@messageEventHandler网页向应用 postMessage 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。H5 暂不支持(可以直接使用 window.postMessage
@onPostMessageEventHandler网页向应用实时 postMessageApp-nvue
@loadEventHandler网页加载成功时候触发此事件。微信小程序、支付宝小程序、抖音小程序、QQ小程序
@errorEventHandler网页加载失败的时候触发此事件。微信小程序、支付宝小程序、抖音小程序、QQ小程序

在小程序端,用法和iframe类似,直接在src赋值在线地址

<web-view src="https://uniapp.dcloud.io/static/web-view.html"></web-view>

注意:

  • 小程序仅支持加载网络网页,不支持本地html
  • 小程序端 web-view 组件一定有原生导航栏,下面一定是全屏的 web-view 组件,navigationStyle: custom 对 web-view 组件无效。
  • 小程序平台, src 指向的链接需登录小程序管理后台配置域名白名单。
  • 小程序平台,个人类型与海外类型的小程序使用 web-view 组件,提交审核时注意微信等平台是否允许使用
  • 小程序的web-view使用的是小程序自带的浏览器内核,不同厂商不一样,详见
  • 各小程序平台,web-view 加载的 url 需要在后台配置域名白名单,包括内部再次 iframe 内嵌的其他 url 。

<web-view> 加载的网页中支持调用部分 uni 接口:

方法名说明平台差异说明
uni.navigateTonavigateTo
uni.redirectToredirectTo
uni.reLaunchreLaunch
uni.switchTabswitchTab
uni.navigateBacknavigateBack
uni.postMessage向应用发送消息抖音小程序不支持、H5 暂不支持(可以直接使用 window.postMessage
uni.getEnv获取当前环境抖音小程序与飞书小程序不支持

uni.postMessage(OBJECT)

网页向应用发送消息,在 <web-view> 的 message 事件回调 event.detail.data 中接收消息。

Tips

  • 传递的消息信息,必须写在 data 对象中。
  • event.detail.data 中的数据,以数组的形式接收每次 post 的消息。(注:支付宝小程序除外,支付宝小程序中以对象形式接受)

#uni.getEnv(CALLBACK)

callback 返回的对象

属性类型说明
plusBooleanApp
nvueBooleanApp-nvue, uni.webview.1.5.4.js+ 支持
miniprogramBoolean微信小程序
smartprogramBoolean百度小程序
miniprogramBoolean支付宝小程序

3.实际操作

下面直接来看示例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>测试</title>
  8. <!-- 引入ui库vant的样式 -->
  9. <link rel="stylesheet" href="./vant.css">
  10. <!-- 引入自定义的全局样式 -->
  11. <link rel="stylesheet" href="./global.css">
  12. <!-- 引入页面样式文件 -->
  13. <link rel="stylesheet" href="./index.css">
  14. </head>
  15. <body>
  16. <div id="app">
  17. <div class="flex-1">
  18. <!-- 嵌入iframe展示vr页面 -->
  19. <iframe class="iframe" src="https://www.realsee.com/website/customer/dataSpace/vr/kPJJK5rx" allowfullscreen="true"
  20. frameborder="0"></iframe>
  21. </div>
  22. <main>
  23. <!-- 底部操作按钮 -->
  24. <div class="ptb-10 flex-vcenter flex-between">
  25. <van-button type="info" @click="handleLook">体验馆带看</van-button>
  26. <van-button type="info" @click="handleRoom">看房型</van-button>
  27. <van-button type="info" @click="handleAsk">立即咨询</van-button>
  28. </div>
  29. <!-- 看房型的弹窗 -->
  30. <van-popup v-model="showRoomPopup" round position="bottom" :overlay="false"
  31. :style="{ minHeight: '10%',padding: '15px 10px 10px',background: 'rgba(0,0,0,.7)' }">
  32. <div class="co-white pb-15" style="position: relative;">
  33. <p class="text-center">房型预览</p>
  34. <div @click="showRoomPopup = false" class="arrow-down-wrap flex-vcenter">
  35. <span class="fs-12 mr-5">收起</span>
  36. <van-icon name="arrow-down" />
  37. </div>
  38. </div>
  39. <van-grid class="rooms-wrap" :column-num="3">
  40. <van-grid-item v-for="(item,index) in urlParams.rooms" :key="index">
  41. <div class="co-white rooms-item" @click="goRoom(item.url)">
  42. <p class="rooms-content">{{item.name}}</p>
  43. <van-image width="100%" height="100%" fit="cover" src="https://img01.yzcdn.cn/vant/cat.jpeg" />
  44. </div>
  45. </van-grid-item>
  46. </van-grid>
  47. </van-popup>
  48. </main>
  49. </div>
  50. <!-- 需要引入的文件 -->
  51. <!-- vue -->
  52. <script type="text/javascript" src="./vue.min.js"></script>
  53. <!-- vant ui库 -->
  54. <script type="text/javascript" src="./vant.min.js"></script>
  55. <!-- 微信小程序 JS-SDK -->
  56. <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
  57. <!-- 与uniapp建立连接 -->
  58. <script type="text/javascript" src="./uni.webview.1.5.5.js"></script>
  59. <!-- 页面的js文件 -->
  60. <script type="text/javascript" src="./index.js"></script>
  61. </body>
  62. </html>
  • 因为使用的vantUi库,所以下载了vant.min.js,想用vue开发所以下载了vue.min.js,这2个不重要
  • 需要引入微信小程序 JS-SDK <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
  • 与uniapp建立连接,引入hellouniapp.dcloud.net.cn/hybrid/html/uni.webview.1.5.5.js,可以下载到本地

调用api与小程序通信

  1. new Vue({
  2. el: '#app',
  3. components: {
  4. },
  5. data () {
  6. return {
  7. urlParams: {
  8. rooms: []
  9. },
  10. showRoomPopup: false
  11. }
  12. },
  13. computed: {
  14. },
  15. created () {
  16. },
  17. watch: {
  18. },
  19. mounted () {
  20. const { params } = this.urlToObj(location.href)
  21. if (params) {
  22. this.urlParams = JSON.parse(decodeURI(params))
  23. }
  24. document.addEventListener('UniAppJSBridgeReady', () => {
  25. uni.getEnv((res) => {
  26. console.log('当前环境:' + JSON.stringify(res));
  27. });
  28. })
  29. },
  30. methods: {
  31. // url参数转对象
  32. urlToObj (url) {
  33. let obj = {};
  34. if (url.indexOf('?') >= 0) {
  35. let str = url.slice(url.indexOf('?') + 1);
  36. let arr = str.split('&');
  37. console.log(str, arr)
  38. for (let j = arr.length, i = 0; i < j; i++) {
  39. let arr_temp = arr[i].split('=');
  40. obj[arr_temp[0]] = arr_temp[1];
  41. }
  42. }
  43. return obj;
  44. },
  45. // 点击体验官带看
  46. handleLook () {
  47. // 跳转到小程序的某个页面
  48. uni.navigateTo({
  49. url: '/pages/vr/look'
  50. });
  51. },
  52. // 点击看房型
  53. handleRoom () {
  54. console.log(this.urlParams)
  55. this.showRoomPopup = true;
  56. },
  57. goRoom (url) {
  58. // 跳转到小程序的某个页面
  59. uni.navigateTo({
  60. url: `/pages/vr/room?url=${url}`
  61. });
  62. },
  63. // 点击咨询
  64. handleAsk () {
  65. // 发送消息给小程序
  66. uni.postMessage({
  67. data: {
  68. action: '咨询'
  69. }
  70. });
  71. // 因为网页向应用 postMessage 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。 所以用uni.redirectTo触发小程序的重新加载实时接收消息
  72. uni.redirectTo({
  73. url: '/pages/vr/vr'
  74. });
  75. }
  76. }
  77. })

页面预览效果:

小提示:如何在开发者工具查看webiew页面的信息

小程序端代码参考

  1. <template>
  2. <web-view :src="vrUrl" @message="onMessage"></web-view>
  3. </template>
  4. <script>
  5. import { callPhone } from '@/utils';
  6. export default {
  7. data() {
  8. return {
  9. vrUrl:
  10. // 这里要换成你的在线网页地址,我这里写的是本地的
  11. `http://127.0.0.1:5500/vr-demo/index.html?params=` +
  12. encodeURI(
  13. JSON.stringify({
  14. rooms: [
  15. {
  16. name: '房间1',
  17. url: 'https://www.realsee.com/website/customer/dataSpace/vr/kPJJK5rx',
  18. },
  19. {
  20. name: '房间2',
  21. url: 'https://www.realsee.com/website/customer/dataSpace/vr/kPJJK5rx',
  22. },
  23. ],
  24. })
  25. ),
  26. };
  27. },
  28. onLoad(props) {
  29. console.log(props);
  30. },
  31. methods: {
  32. // 接收webview传来的消息
  33. onMessage(e) {
  34. const { data } = e.detail;
  35. console.log(
  36. data,
  37. 'web-view传来的信息,在小程序后退、组件销毁、分享会触发'
  38. );
  39. console.log(data.at(-1));
  40. if (data?.at(-1)?.action === '咨询') {
  41. callPhone('18205236589');
  42. }
  43. },
  44. },
  45. };
  46. </script>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/636901
推荐阅读
相关标签
  

闽ICP备14008679号