uniapp 打包 H5 实现在 uniapp 打包 APP 的 webview 通信

一、前言

遇到 uniapp 打包的 APP 在 webview 内嵌入 uniapp 打包的 H5 页面的需求,并实现通信。本篇主要总结了如何实现并总结遇到的问题,希望可以帮助大家减少负担。

实现需求主要有三个地方需要处理:

  1. index.html 的打包配置
  2. 导入 uni.webview.js
  3. 使用 myUni.getEnv() 导入和 myUni.webView.postMessage() 导出
二、index.html 的打包配置

直接拷贝覆盖 index.html 即可

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<title>
			<%= htmlWebpackPlugin.options.title %>
		</title>
		<!-- Open Graph data -->
		<!-- <meta property="og:title" content="Title Here" /> -->
		<!-- <meta property="og:url" content="http://www.example.com/" /> -->
		<!-- <meta property="og:image" content="http://example.com/image.jpg" /> -->
		<!-- <meta property="og:description" content="Description Here" /> -->
		<script>
			var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS
				.supports('top: constant(a)'))
			document.write(
				'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
				(coverSupport ? ', viewport-fit=cover' : '') + '" />')
		</script>
		<link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
	</head>
	<body>
		<noscript>
			<strong>Please enable JavaScript to continue.</strong>
		</noscript>
		<div id="app"></div>
		<!-- built files will be auto injected -->
		<script type="text/javascript">
			var userAgent = navigator.userAgent;
			if (userAgent.indexOf('AlipayClient') > -1) {
				// 支付宝小程序的 JS-SDK 防止 404 需要动态加载,如果不需要兼容支付宝小程序,则无需引用此 JS 文件。
				document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');
			} else if (/QQ/i.test(userAgent) && /miniProgram/i.test(userAgent)) {
				// QQ 小程序
				document.write(
					'<script type="text/javascript" src="https://qqq.gtimg.cn/miniprogram/webview_jssdk/qqjssdk-1.0.0.js"><\/script>'
				);
			} else if (/miniProgram/i.test(userAgent) && /micromessenger/i.test(userAgent)) {
				// 微信小程序 JS-SDK 如果不需要兼容微信小程序,则无需引用此 JS 文件。
				document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');
			} else if (/toutiaomicroapp/i.test(userAgent)) {
				// 头条小程序 JS-SDK 如果不需要兼容头条小程序,则无需引用此 JS 文件。
				document.write(
					'<script type="text/javascript" src="https://s3.pstatp.com/toutiao/tmajssdk/jssdk-1.0.1.js"><\/script>');
			} else if (/swan/i.test(userAgent)) {
				// 百度小程序 JS-SDK 如果不需要兼容百度小程序,则无需引用此 JS 文件。
				document.write(
					'<script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.18.js"><\/script>'
				);
			} else if (/quickapp/i.test(userAgent)) {
				// quickapp
				document.write('<script type="text/javascript" src="https://quickapp/jssdk.webview.min.js"><\/script>');
			}
		</script>
		<!-- uni 的 SDK -->
		<script type="text/javascript" src="<%= BASE_URL %>static/uni.webview.js"></script>
		<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script>
		<script type="text/javascript">
			// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
			document.addEventListener('UniAppJSBridgeReady', function() {
				uni.postMessage({
					data: {
						action: 'message'
					}
				});
				uni.getEnv(function(res) {
					console.log('当前环境:' + JSON.stringify(res));
				});
			});
			document.addEventListener('UniAppJSBridgeReady', function() {
				console.log('UniAppJSBridgeReady');
				webUni.getEnv(function(res) {
					console.log('当前环境:' + JSON.stringify(res));
				});
			});
		</script>
	</body>
</html>
三、导入 uni.webview.js

image-20240621095500277

在文件根目录下新建 utils 目录,新建 uni.webview.1.5.2.js ,拷贝代码导入:

!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){"use strict";try{var e={};Object.defineProperty(e,"passive",{get:function(){!0}}),window.addEventListener("test-passive",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function t(e,t){return n.call(e,t)}var i=[],a=function(e,n){var t={options:{timestamp:+new Date},name:e,arg:n};if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){if("postMessage"===e){var a={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(a):window.__dcloud_weex_.postMessage(JSON.stringify(a))}var o={type:"WEB_INVOKE_APPSERVICE",args:{data:t,webviewIds:i}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(o):window.__dcloud_weex_.postMessageToService(JSON.stringify(o))}if(!window.plus)return window.parent.postMessage({type:"WEB_INVOKE_APPSERVICE",data:t,pageId:""},"*");if(0===i.length){var r=plus.webview.currentWebview();if(!r)throw new Error("plus.webview.currentWebview() is undefined");var d=r.parent(),s="";s=d?d.id:r.id,i.push(s)}if(plus.webview.getWebviewById("__uniapp__service"))plus.webview.postMessageToUniNView({type:"WEB_INVOKE_APPSERVICE",args:{data:t,webviewIds:i}},"__uniapp__service");else{var w=JSON.stringify(t);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE",'",').concat(w,",").concat(JSON.stringify(i),");"))}},o={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;a("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("redirectTo",{url:encodeURI(n)})},getEnv:function(e){window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a("postMessage",e.data||{})}},r=/uni-app/i.test(navigator.userAgent),d=/Html5Plus/i.test(navigator.userAgent),s=/complete|loaded|interactive/;var w=window.my&&navigator.userAgent.indexOf("AlipayClient")>-1;var u=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var g=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var v=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);for(var l,_=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},f=[function(e){if(r||d)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&s.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),o},function(e){if(v)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(w){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(u)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(g)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){return document.addEventListener("DOMContentLoaded",e),o}],m=0;m<f.length&&!(l=f[m](_));m++);l||(l={});var E="undefined"!=typeof uni?uni:{};if(!E.navigateTo)for(var b in l)t(l,b)&&(E[b]=l[b]);return E.webView=l,E}));

打开 main.js 导入 uni.webview.1.5.2.js:

import App from './App'

// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
// ***************************** 导入 ***************************** //
import * as uni from './utils/uni.webview.1.5.2.js'  

document.addEventListener("UniAppJSBridgeReady", function() { // 这里必须更换uni,不然指向有误
    Vue.prototype.myUni = uni  
});
// *************************************************************** //
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
  ...App
})
app.$mount()
// #endif

// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
  const app = createSSRApp(App)
  return {
    app
  }
}
// #endif
四、页面使用

webview 页面:

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

<script>
	export default {
		data() {
			return {
				url: 'http://XXX.XXX.X.XXX:XXXX/?data='
			};
		},
		onLoad() {
             let data = [{
                 name:'测试数据'
             }]
			this.url += encodeURIComponent(JSON.stringify(data))
		},
		methods: {
             // 在小程序中没办法这样轻松获取数据,只有在离开页面、转发、销毁等情况下才可以获取,十分离谱
			message(arg) { // 获取 H5 提交参数
				console.log(arg)
			},
		}
	};
</script>

H5 页面

<template>
	<view @click="sendMessage()"></view>
</template>

<script>
	export default {
		data() {
			return {
			}
		},
		mounted() {
			let data = this.getQuery('data') // 获取页面信息
			console.log('data=============>>>>>>>>', JSON.parse(data));
		},
		methods: {
			//取url中的参数值
			getQuery(name) {
				// 正则:[找寻'&' + 'url参数名字' = '值' + '&']('&'可以不存在)
				let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
				let r = window.location.search.substr(1).match(reg);
				console.log(r);
				if (r != null) {
					// 对参数值进行解码
					return decodeURIComponent(r[2]);
				}
				return null;
			},
             sendMessage() { // 提交参数
				let that = this;
				this.myUni.webView.postMessage({ // 提交参数一定要放在data内
					data: {
						id: 0,
						text: 'Id'
					},
				});
			},
		}
	}
</script>
五、参考

webview使用uniapp项目开发无法使用uni.postMessage(踩坑经验分享) - DCloud问答

uniapp使用webview嵌入vue页面及通信_uniapp webview页面和嵌入的子页面通信-CSDN博客

如何在uniapp中优雅地使用WebView - 林恒 - 博客园 (cnblogs.com)

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

如何在uniapp中优雅地使用WebView - 林恒 - 博客园 (cnblogs.com)

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

uni-app和web-view页面相互传参_uniapp webview传参-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 CAN总线通讯

使用STM32的CAN通讯&#xff0c;利用回环模式&#xff0c;按键控制发送CAN数据&#xff0c;中断接收CAN数据并通过串口助手打印出来。 7.2、配置引脚信息 由于每次新建工程都需要配置信息&#xff0c;比较麻烦&#xff0c;好在STM32CubeIDE提供了导入.ioc文件的功能&#xff…

eclipse中svn从分支合并到主干及冲突解决

1、将分支先commit&#xff0c;然后再update&#xff0c;然后再clean一下&#xff0c;将项目多余的target都清理掉。 2、将branches切换到trunk 3、工程上右键-》Team-》合并&#xff08;或Merge&#xff09; 4、默认选项&#xff0c;点击Next 5、有未提交的改动&#xff0c;…

Python轻松设置Excel单元格数字显示格式

Excel作为强大的数据处理与分析工具&#xff0c;不仅能够存储大量数据&#xff0c;还支持复杂的数据处理与可视化功能。而如何恰当地展示Excel表格中的数据是Excel文件制作的关键之一。这便涉及到Excel单元格数字格式的设置。数字格式不仅关乎数据的美学呈现&#xff0c;如货币…

钒能新材料综合回收利用,钒溶液净化富集工艺之离子交换法

钒电池储能产业作为典型的绿色低碳优势产业&#xff0c;是新型储能领域重要发展方向。钒电池储能具备大规模、长周期等优势&#xff0c;是储能领域的重要组成部分&#xff0c;将成为拓展电能利用、应对可再生能源随机波动、支撑可再生能源高占比电力系统的最佳技术途径之一。 …

【R语言】地理探测器模拟及分析(Geographical detector)

地理探测器模拟及分析 1. 写在前面2. R语言实现2.1 数据导入2.2 确定数据离散化的最优方法与最优分类2.3 分异及因子探测器&#xff08;factor detector&#xff09;2.4 生态探测器&#xff08;ecological detector&#xff09;2.5 交互因子探测器&#xff08;interaction dete…

处理机调度算法即cpu scheduling

i Arrival Time 到达时间Burst Time服务时间 response time开始时间-到达时间 FCFS 按照进程顺序 finsh 按照进程顺序 从0开始依次加上服务时间 周转时间即 finsh时间-到达时间&#xff08;注意不是开始时间&#xff09; waiting time等待时间开始时间-到达时间 带权周转时…

VsCode-PlatformIO 开发环境搭建

在VScode中搜索PlatformIO&#xff0c;然后点击install 安装即可 安装后重新打开vscode&#xff0c;会出现如下界面。

Photoshop揭秘:图像处理领域的领军软件

Photoshop 是一款由 Adobe 企业开发的图像处理软件&#xff0c;也被大家简称为 PS。在广告设计、摄影后期、数字绘画、网页设计等各个领域都得到了广泛的应用&#xff0c;是目前业界最受欢迎的图像处理软件之一。作为一款图像处理软件&#xff0c;Photoshop 为设计者提供了许多…

接到一家公司做团购活动类型的策划海报项目,使用AI给他们设计了相关的海报

在这个充满挑战和机遇的时代&#xff0c;我有幸接到一家公司的委托&#xff0c;为他们策划一场团购活动。这不仅是对我的专业能力的认可&#xff0c;也是对我创新思维的考验。 这家公司是一家知名的电子产品销售商&#xff0c;他们希望通过团购活动来提升产品的销售量和品牌的…

基于国产飞腾2000制作的paddleocr hubserving服务docker镜像文件

目录导航 paddleocr hubserving国产化飞腾、鲲鹏armv8 api服务镜像制作 一、编译paddle 二、准备Dockerfile文件 三、制作paddleocr hubserving服务镜像 四、paddleocr hubserving镜像导出和导入 paddleocr hubserving国产化飞腾、鲲鹏armv8 api服务镜像制作 一、编译padd…

爆火的AI姓名头像号篇篇10w+, 流量主赚麻了...

最近二师兄在刷公众号时&#xff0c;看到一个非常有趣的账号。简单又“暴li”。 几乎篇篇10w。点击去一看&#xff0c;内容也是非常极简&#xff0c;利用姓氏生成头像。一个字都不多。 几乎每篇文末都有广告&#xff0c;一篇10w按照800来算&#xff0c; 一个月大概 ~~一七得七、…

重生奇迹MU整理装备注意事项

想成为奇迹MU的顶尖玩家&#xff0c;整理装备是必不可少的一项技能。在这篇文章中&#xff0c;我们将为您分享一些整理装备的注意事项与技巧&#xff0c;帮助您在游戏中更好地管理装备&#xff0c;提升你的实力。 整理装备&#xff0c;须知几点 整理装备是每位玩家必须完成的…

异步编程中的性能优化技巧

异步编程中的性能优化技巧 在上一篇文章中&#xff0c;我们详细介绍了Python中的异步编程及其基础知识和实战应用。今天&#xff0c;我们将深入探讨异步编程中的性能优化技巧&#xff0c;帮助你进一步提升异步代码的效率。 异步编程中的性能优化技巧结语 异步编程中的常见性能问…

电子设计新宠SmartEDA:揭秘其爆红背后的神秘力量

SmartEDA账号免费领取https://www.ismarteda.com 在当下这个电子科技迅猛发展的时代&#xff0c;电子设计领域的创新层出不穷。其中&#xff0c;SmartEDA作为一颗璀璨的新星&#xff0c;凭借其卓越的性能和便捷的操作体验&#xff0c;迅速在电子设计领域崭露头角&#xff0c;成…

【MAUI】resource xml/file_paths (aka com.xxx.xxx:xml/ file _paths) not found.

APP2260:resource xml/file_paths (aka com.zettlercn.wms:xml/ file _paths) not found. This error is likely caused by an issue with the AndroidManifest.xml file or an Android manifest generation attribute in a source code file MAUI从6.0升级到8.0,调试发现资源…

kylinos 国产操作系统离线安装firefox 麒麟操作系统安装新版本firefox

1. 火狐地址&#xff1a; 下载 Firefox 浏览器&#xff0c;这里有简体中文及其他 90 多种语言版本供您选择 2. 选择&#xff1a; 3. 下载完之后&#xff0c;上传到离线机器 4. 解压缩&#xff1a; tar -xvjf firefox-127.0.1.tar.bz2 5. 去点击解压后的文件夹&#xff0c;找…

mybatisplus字段注入MetaObjectHandler扫描不到我的指定填充字段

使用mybatisplus自带的字段填充策略注入值的时候&#xff0c;发现并没有扫描到我的指定字段。 1. 初始代码 Component Slf4j public class MyMetaObjectHandler implements MetaObjectHandler {private static final String createByFiled "createBy";private stati…

eclipse中没有SERVER的解决办法(超详细)

将 Tomcat 和 Eclipse 相关联时&#xff0c;Eclipse有的版本发现 发现eclipse->【Window】->【Preferences】里没有【server】从而配置不了Runtime Environment。所以需要通过eclipse进行安装。 通过我个人的经验下面给出解决办法&#xff1a; 一、获取 Eclipse版本 点击…

使用MyBatisPlus进行字段的自动填充

使用MyBatisPlus进行字段的自动填充 需求场景 当我们往数据库里面插入一条数据&#xff0c;或者是更新一条数据时&#xff0c;一般都需要标记创建时间create_time和更新时间update_time的值&#xff0c;但是如果我们每张表的每个请求&#xff0c;在执行sql语句的时候我们都手…

绝望的C#:TreeView为什么双击自动展开、折叠?双击事件的参数根本不是双击位置

双击打开编辑窗口应该是个再正常不过的想法吧&#xff1f;但是被自动展开、折叠搅了。 为什么自动展开折叠就出问题了&#xff1f;因为在某些情况下自动展开、折叠改变了节点的显示位置&#xff0c;节点的位置向下了——因为折叠导致下方内容变少&#xff0c;控件为了避免下方出…