微信小程序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.实际操作

下面直接来看示例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>测试</title><!-- 引入ui库vant的样式 --><link rel="stylesheet" href="./vant.css"><!-- 引入自定义的全局样式 --><link rel="stylesheet" href="./global.css"><!-- 引入页面样式文件 --><link rel="stylesheet" href="./index.css"></head><body><div id="app"><div class="flex-1"><!-- 嵌入iframe展示vr页面 --><iframe class="iframe" src="https://www.realsee.com/website/customer/dataSpace/vr/kPJJK5rx" allowfullscreen="true"frameborder="0"></iframe></div><main><!-- 底部操作按钮 --><div class="ptb-10 flex-vcenter flex-between"><van-button type="info" @click="handleLook">体验馆带看</van-button><van-button type="info" @click="handleRoom">看房型</van-button><van-button type="info" @click="handleAsk">立即咨询</van-button></div><!-- 看房型的弹窗 --><van-popup v-model="showRoomPopup" round position="bottom" :overlay="false":style="{ minHeight: '10%',padding: '15px 10px 10px',background: 'rgba(0,0,0,.7)' }"><div class="co-white pb-15" style="position: relative;"><p class="text-center">房型预览</p><div @click="showRoomPopup = false" class="arrow-down-wrap flex-vcenter"><span class="fs-12 mr-5">收起</span><van-icon name="arrow-down" /></div></div><van-grid class="rooms-wrap" :column-num="3"><van-grid-item v-for="(item,index) in urlParams.rooms" :key="index"><div class="co-white rooms-item" @click="goRoom(item.url)"><p class="rooms-content">{{item.name}}</p><van-image width="100%" height="100%" fit="cover" src="https://img01.yzcdn.cn/vant/cat.jpeg" /></div></van-grid-item></van-grid></van-popup></main></div><!-- 需要引入的文件 --><!-- vue --><script type="text/javascript" src="./vue.min.js"></script><!-- vant ui库 --><script type="text/javascript" src="./vant.min.js"></script><!--  微信小程序 JS-SDK  --><script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script><!-- 与uniapp建立连接 --><script type="text/javascript" src="./uni.webview.1.5.5.js"></script><!-- 页面的js文件 --><script type="text/javascript" src="./index.js"></script>
</body></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与小程序通信

new Vue({el: '#app',components: {},data () {return {urlParams: {rooms: []},showRoomPopup: false}},computed: {},created () {},watch: {},mounted () {const { params } = this.urlToObj(location.href)if (params) {this.urlParams = JSON.parse(decodeURI(params))}document.addEventListener('UniAppJSBridgeReady', () => {uni.getEnv((res) => {console.log('当前环境:' + JSON.stringify(res));});})},methods: {// url参数转对象urlToObj (url) {let obj = {};if (url.indexOf('?') >= 0) {let str = url.slice(url.indexOf('?') + 1);let arr = str.split('&');console.log(str, arr)for (let j = arr.length, i = 0; i < j; i++) {let arr_temp = arr[i].split('=');obj[arr_temp[0]] = arr_temp[1];}}return obj;},// 点击体验官带看handleLook () {// 跳转到小程序的某个页面uni.navigateTo({url: '/pages/vr/look'});},// 点击看房型handleRoom () {console.log(this.urlParams)this.showRoomPopup = true;},goRoom (url) {// 跳转到小程序的某个页面uni.navigateTo({url: `/pages/vr/room?url=${url}`});},// 点击咨询handleAsk () {// 发送消息给小程序uni.postMessage({data: {action: '咨询'}});// 因为网页向应用 postMessage 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。 所以用uni.redirectTo触发小程序的重新加载实时接收消息uni.redirectTo({url: '/pages/vr/vr'});}}
})

页面预览效果:

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

小程序端代码参考

<template><web-view :src="vrUrl" @message="onMessage"></web-view>
</template><script>
import { callPhone } from '@/utils';
export default {data() {return {vrUrl:// 这里要换成你的在线网页地址,我这里写的是本地的`http://127.0.0.1:5500/vr-demo/index.html?params=` +encodeURI(JSON.stringify({rooms: [{name: '房间1',url: 'https://www.realsee.com/website/customer/dataSpace/vr/kPJJK5rx',},{name: '房间2',url: 'https://www.realsee.com/website/customer/dataSpace/vr/kPJJK5rx',},],})),};},onLoad(props) {console.log(props);},methods: {// 接收webview传来的消息onMessage(e) {const { data } = e.detail;console.log(data,'web-view传来的信息,在小程序后退、组件销毁、分享会触发');console.log(data.at(-1));if (data?.at(-1)?.action === '咨询') {callPhone('18205236589');}},},
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPA机器人怎么操作知乎好物推荐自动点击【添加】商品按钮?

先看需要实现的效果&#xff08;启动机器人-点击收益&#xff08;打开商品卡片列表&#xff09;-点击添加&#xff08;自动添加商品卡片到文章&#xff09;&#xff09;&#xff1a; 学员提问&#xff1a; 知乎上点击好物推荐【添加】商品按钮&#xff0c;iframe的元素是动态的…

表情识别 | 卷积神经网络(CNN)人脸表情识别(Matlab)

表情识别 | 卷积神经网络(CNN)人脸表情识别&#xff08;Matlab&#xff09; 目录 表情识别 | 卷积神经网络(CNN)人脸表情识别&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab使用卷积神经网络(CNN)&#xff0c;进行人脸表情情绪识别…

数据结构(九)---并查集

目录 1.集合 2.集合的相关操作 (1)查(Find)&#xff1a; •Find操作的优化 (2)并(Union)&#xff1a; •Union操作的优化 1.集合 数据元素之间的逻辑关系可以为集合&#xff0c;树形关系&#xff0c;线性关系&#xff0c;图关系。对于集合而言&#xff0c;一个集合可以划…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上部署神经网络之指纹识别(Pytorch)的数据准备和模型训练过程等,…

Chrome 网络调试程序 谷歌网络调试 network

目录 1.网络面板总览2.概况了解3.Waterfall接口排队等待时间4.关注请求接口的Size,可能是占据内存溢出的接口5.过滤器一栏 fetch/xhr 什么意思6. Stalled 什么意思7.Queueing 什么意思8.Queueing和Stalled之间什么关系9.为什么会有阻塞状态10.Time列是pending 什么意思 1.网络面…

宏基因组|使用MEGAHIT组装

简介 MEGAHIT 是一款超快速且内存高效的下一代测序&#xff08;NGS&#xff09;组装工具&#xff0c;专门针对宏基因组进行了优化&#xff0c;同时在处理常规单个基因组&#xff08;小型或哺乳动物规模&#xff09;以及单细胞组装任务时也有出色表现。 主要特点与功能&#x…

node.js egg.js

Egg 是 Node.js 社区广泛使用的框架&#xff0c;简洁且扩展性强&#xff0c;按照固定约定进行开发&#xff0c;低协作成本。 在Egg.js框架中&#xff0c;ctx 是一个非常核心且常用的对象&#xff0c;全称为 Context&#xff0c;它代表了当前 HTTP 请求的上下文。ctx 对象封装了…

数据库和表创建练习

一丶要求 1.创建一个数据库db_classes 2 创建一行表db_hero 3. 将四大名著中的常见人物插入这个英雄表 二丶创建db_classes一个数据库, 使用数据库默认的字符集 create database db_classes; 三丶创建一行表db_hero 1.先切换到我们创建的db_classes;数据库中 use db_class…

怎么从回收站恢复已删除的文件?(5种恢复方法)

回收站是电脑操作系统中的一个特殊目录&#xff0c;用于存储被删除但尚未完全清除的文件和文件夹。当用户删除文件或文件夹时&#xff0c;它们并不立即从硬盘驱动器中移除&#xff0c;而是被移动到回收站。这样设计的目的是为了给用户一个“第二次机会”&#xff0c;如果他们意…

nvm的下载与安装

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理 Node.js 版本的工具&#xff0c;它允许您在同一台计算机上安装和切换不同的 Node.js 版本。 一、下载地址 https://github.com/coreybutler/nvm-windows/releases 二、安装nvm 三、设置环境变量 在命令提示…

linux系统-FTP服务配置

目录 一、FTP简介 1.什么是FTP&#xff1f;&#xff1f;&#xff1f; 2.FTP的两种模式 二、安装配置FTP服务 1.关闭防火墙和核心防护 2.安装VSFTPD 3.修改配置文件 4.黑白名单设置 一、FTP简介 1.什么是FTP&#xff1f;&…

uniapp-css多颜色渐变:左右+上下

案例展示 案例代码&#xff1a; 代码灵感&#xff1a;使用伪类进行处理 <view class"headBox"></view>.headBox {height: 200rpx;background: linear-gradient(to right, #D3D5F0, #F0DCF3, #F7F6FB, #DAE8F2, #E1D3EE);position: relative; }.headBox…

理解归并排序的两种方法(超详细)

目录 前言 一.方法一&#xff1a;归并排序 1.1 归并思路 1.1.1 递归(分解) 1.1.2 区间(排序) 1.1.3 合并拷贝回原数组(合并) 二.归并排序过程 2.1 递归(分解)图解 2.2 归并有序区间(排序)图解 2.2.1 单独一趟排序 2.2.2 有序区间递归排序 2.2.3 数组拷贝(合并) 2.3 归并全部代码…

SpringCloud(微服务介绍,远程调用RestTemplate,注册中心Nacos,负载均衡Ribbon,环境隔离,进程和线程的区别)【详解】

目录 一、微服务介绍 1. 系统架构的演变 1 单体架构 2 分布式服务 3 微服务 2. SpringCloud介绍 SpringCloud简介 SpringCloud版本 3. 小结 二、远程调用RestTemplate【理解】 1. 服务拆分 1 服务拆分原则 2 服务拆分示例 1) 创建父工程 2) 准备用户服务 1. 用户…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

Appium一本通

Appium介绍 概念&#xff1a;Appium是一个移动App(手机应用)自动化工具。 用途&#xff1a;重复性任务、爬虫、自动化测试。 特点&#xff1a;开源免费、多平台支持(ios\android)、多类型支持(native\webview)、类selenium支持多语言(java\python\js\ruby) Appium原理 三个主…

Java中的ArrayList

ArrayList<E>的特点 可调整大小的数组实现 <E>:是一种数据类型 ArrayList的构造方法 ArrayList list new ArrayList();创建一个空的集合对象 package dayhou40.day45; ​ import java.util.ArrayList; ​ public class Arraylisttest {public static void ma…

客户端连接ZK失败处理方案

文章目录 背景介绍报错信息处理方案第一步、查看zookeeper启动是否正常第二步、检查本地网络是否正常第三步、检查本地JDK版本 对于zookeeper服务注册中心&#xff0c;在前期【 Dubbo框架注册中心-Zookeeper搭建】博客中有环境搭建部署介绍&#xff0c;感兴趣可以参考安装。 背…

python使用opencv对图像的基本操作(2)

13.对多个像素点进行操作&#xff0c;使用数组切片方式访问 img[i,:] img[j,:] #将第j行的数值赋值给第i行 img[-2,:]或img[-2] #倒数第二行 img[:,-1] #最后一列 img[50:100,50:100] #50-100行&#xff0c;50-100列&#xff08;不包括第100行和第100列&#xff09; img[:100…

SpringCloud系列(18)--将服务提供者Provider注册进Consul

前言&#xff1a;在上一章节中我们把服务消费者Consumer注册进了Zookeeper&#xff0c;并且成功通过服务消费者Consumer调用了服务提供者Provider&#xff0c;而本章节则是关于如何将服务提供者Provider注册进Consul里 准备环境&#xff1a; 先安装Consul&#xff0c;如果没有…