uniapp企业微信web-view父子通信问题
项目背景:开发工具为HBuilderX,框架为uniapp,开发移动端的Web应用,在企业微信中使用(自建应用),Web开发的应用,不是小程序。
需求:页面中用到<web-view>组件,加载其他系统的页面(有跨域),需要在父子页面之间相互通信。这里通信的东西其实就是获取定位,通过uniapp获取用户定位信息,传递给<web-view>内的页面用于地图的展示和其他业务需求。获取定位也是遇到了一些问题,参考另一篇记录《uniapp企业微信应用中的定位问题》
<web-view :src="https://****"></web-view>
<web-view>内部其实就是iframe,因此本质上也就是要实现iframe的(跨域)父子通信。
原始方案:URL传递
在uniapp中获取定位数据,通过URL参数的方式传递给<web-view>的页面。
<web-view :src="https://****?&longitude=${longitude}&latitude=${latitude}"></web-view>
这个方法弊端很多,不得不抛弃。
- 性能影响&用户体验:很多时候
<web-view>内的子页面是不需要该定位数据的,只要当有用到地图组件时,才需要获取定位。这种方式不管要不要,都处理(获取、发送),很影响性能,而且企业微信中获取定位会弹出定位授权提示。 - 重复加载页面,而且会导致
<web-view>加载多次,因为获取定位是异步的,参数变化会影响url(src)的变更,触发页面重新加载。
web-view相互通信
优化目标是在需要加载地图组件时,向父页面(uniapp)发送请求指令,父页面(uniapp)获取定位信息后,发送给子页面,按需获取。
基本的技术思路就是利用window/uni的postMessage、onmessage来实现相互通信。但实际上由于uniapp面向各种不同的场景,如小程序、移动App、企业微信H5应用,实现方式略有不同,网上各种方案不一定行得通,因此记录一下解决过程。
在子页面发送指令
子页面给父页面(uniapp)发送指令,请求获取定位信息,使用了uniapp提供的一个SDK来实现。
window.uni.postMessage()方法发送指令信息。window.onmessage事件接收消息。
mounted() {
// 发送消息指令
window.uni.postMessage({ data: { type: 'getLocation' } })
// 等待接收消息
window.onmessage = (e) => {
if (e.data?.getLocation) {
console.log('e.data?.getLocation', e.data.getLocation)
this.point = e.data?.getLocation
this.asyncInitMap()
}
}
},
这里的uni是uniapp提供的一个SDK,在程序中引用JS文件。
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
在uniapp父页面中接收、响应
window.onmessage事件接收消息指令,判断是否约定的指令。- 获取定位并发送,发送通过
this.$refs.webview.iframe.contentWindow.postMessage(res, url)方法发送定位结果给子页面。 - 注意的是,第一个参数为要发送的数据,第二个参数为目标域名,否则会发送失败(不同域名)。
<template>
<web-view :src="src" ref="webview"></web-view>
</template>
<script>
import webview from './webview'
import getLocation from './Location.js'
export default {
mixins: [webview],
data() {
return {
src: '',
};
},
onLoad(options) {
this.src = 'http://****/q=**'
//接收指令
window.onmessage = (e) => {
//判断指令
if(e.data?.data?.arg?.type === 'getLocation'){
//获取定位并发送过去
getLocation().then(res => {
this.$refs.webview.iframe.contentWindow.postMessage({getLocation:res},this.webviewServer)
}).catch(err => console.log(err))
}
}
},
}
</script>
这一步借助了chartGPT(3.5版本)的帮助,当然也是经过多轮对话才找到一点可用的,直接问他uniapp中的webview通信方式,答案也不靠谱。

参考资料
- uniapp企业微信应用中的定位问题
- chartGPT
️版权申明:版权所有@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!原文编辑地址-语雀
uniapp企业微信web-view父子通信问题的更多相关文章
- 【Python之路】特别篇--微信Web网页版通信的全过程分析
文章所使用Python版本为py3.5 1.微信服务器返回一个会话ID 微信Web版本不使用用户名和密码直接登录,而是采用二维码登录,所以服务器需要首先分配一个唯一的会话ID,用来标识当前的一次登录. ...
- 挖掘微信Web版通信的全过程
昨天是周末,在家闲得无聊,于是去weiphone.com逛了一圈,偶然发现有人发了一帖叫<微信 for Mac>,这勾起了我的好奇心,国内做Mac开发的人确实很少,对于那些能够独自开发一些 ...
- 如何使用微信web开发者工具调试企业微信
最近因工作需要围绕着企业微信来进行调试,从而掏出了我的微信web开发者工具,在进行授权的时候微信web开发者工具成功的提示了我:“您未绑定企业微信开发者权限”.那么关键来了,因为我也百度过,发现也有很 ...
- 企业微信域名IP列表
https://res.mail.qq.com/zh_CN/wework_ip/latest.html?st=C98F886B96A94AD2207D9F0B2970B93DFD5A76DF94CED ...
- CabloyJS一站式助力微信、企业微信、钉钉开发 - 企业微信篇
前言 现在软件开发不仅要面对前端碎片化,还要面对后端碎片化.针对前端碎片化,CabloyJS提供了pc=mobile+pad的跨端自适应方案,参见:自适应布局:pc = mobile + pad 在这 ...
- 挖掘微信Web版通信的全过程 [转]
昨天是周末,在家闲得无聊,于是去weiphone.com逛了一圈,偶然发现有人发了一帖叫<微信 for Mac>, 这勾起了我的好奇心,国内做Mac开发的人确实很少,对于那些能够独自开发一 ...
- 利用微信web开发者工具调试企业微信页面
1.只有企业号的管理员才能调试. 2.勾选企业号的开发者工具(具体位置见下图,这个入口位置总是在变,一般来说,找到”微工作台“就能找到了) 3.下载web开发者工具 https://developer ...
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...
- 使用uView UI+UniApp开发微信小程序
在前面随笔的介绍中,我们已经为各种框架,已经准备了Web API.Winform端.Bootstrap-Vue的公司动态网站前端.Vue&Element的管理前端等内容,基本都是基于Web A ...
- .NET Core企业微信网页授权登录
1.开发前准备 参数获取 corpid 每个企业都拥有唯一的corpid,获取此信息可在管理后台"我的企业"-"企业信息"下查看"企业ID" ...
随机推荐
- 全渠道定价、库存决策,运筹混合整数规划建模求解,MNL选择模型,内附代码!
0. 写在前面 刊论文!模型简单,代码实现更简单,墙裂推荐!可为运筹建模提供参考,也可作为全渠道零售研究的入门资料ε٩(๑> ₃ <)۶з 全文有点长,前面先放一个博文结构和涉及内容: 第 ...
- 3d基础 - 从模型坐标到屏幕坐标
在 3D 引擎中,场景通常被描述为三维空间中的模型或对象,每个模型对象由许多三维顶点组成.最终,这些模型对象将在平面屏幕上呈现和显示. 渲染场景始终相对于摄像机,因此,还必须相对于摄像机的视图定义场景 ...
- 统计数据异常值的处理——R语言
在数据分析工作中,面对收集而来的数据,数据清洗是首要环节.异常值(outlier)是数据清洗的重要环节,异常值可能直接会导致后面的数据分析.建模工作出现偏差,下面就给大家介绍一下如何处理数据中的异常值 ...
- 从内核源码看 slab 内存池的创建初始化流程
在上篇文章 <细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现 >中,笔者从 slab cache 的总体架构演进角度以及 slab cache 的运行原理角度为大家勾勒 ...
- Kubuesphere部署Ruoyi(二):部署kubesphere
先决条件: 更换DNS 更换apt的镜像源 Ubuntu下永久性修改DNS vi /etc/systemd/resolved.conf DNS字段取消注释,并修改DNS为223.5.5.5 223.5 ...
- Rainbond 结合 Jpom 实现云原生 & 本地一体化项目管理
Jpom 是一个简而轻的低侵入式在线构建.自动部署.日常运维.项目运维监控软件.提供了: 节点管理:集群节点,统一管理多节点的项目,实现快速一键分发项目文件 项目管理:创建.启动.停止.实时查看项目控 ...
- python+folium
建模时无意中发现了一个很好用的交互式画地图的库!!
- 用Python语言进行时间序列ARIMA模型分析
应用时间序列 时间序列分析是一种重要的数据分析方法,应用广泛.以下列举了几个时间序列分析的应用场景: 1.经济预测:时间序列分析可以用来分析经济数据,预测未来经济趋势和走向.例如,利用历史股市数据和经 ...
- 2022-06-14:数组的最大与和。 给你一个长度为 n 的整数数组 nums 和一个整数 numSlots ,满足2 * numSlots >= n 。总共有 numSlots 个篮子,编号为 1
2022-06-14:数组的最大与和. 给你一个长度为 n 的整数数组 nums 和一个整数 numSlots ,满足2 * numSlots >= n .总共有 numSlots 个篮子,编号 ...
- 2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属
2022-04-18:things是一个N3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属商 ...