【工作实践-06】uniapp使用webView

一、建立APP页面和webview的通讯

1.引入webview.js

App 端使用 uni.web-view.js 的最低版为 uni.webview.1.5.4.js

APP端可以支持网络网页和本地网页,但如果使用本地网页和相关资源(js、css等文件)必须放在**static**目录下。

2.引入搭桥document.addEventListener('UniAppJSBridgeReady',function(){})

在app端是识别不到document元素的,所以为了适配app,需要将搭桥的方法单独建立一个js文件放到**static**目录下

javascript 复制代码
document.addEventListener('UniAppJSBridgeReady', function () {
	console.log('我建立起了通讯');
	uni.postMessage({
		data: {
			successFlag: true,
		}
	});
})

3.发送消息

首先<web-view>中需要添加message的监听,当网页向应用 postMessage 时,会在特定时机(后退、组件销毁、分享)触发并收到消息。

html 复制代码
<web-view ref="webview" :src="webViewUrl" @message="onPostMessage"></web-view>

其次网页向应用 postMessage 需要通过 wv.evalJS(``)方法,在此方法中利用uniapp的postMessage()方法向应用发送消息

javascript 复制代码
wv.evalJS(`uni.postMessage({
					data: {
					  base64: canvas.toDataURL("image/png"),
					}
				});	`)

最后在uniapp通过 onPostMessage 函数中获取网页信息

javascript 复制代码
onPostMessage: function (e) {
				console.log(e.detail.data[0])
			},

二、webview初始化遇坑

1.setJsFile() 和 appendJsFile() 方法的区别

在初始化webview时,需要引入webview.js文件和添加的搭桥 js (post.js)文件

此时需注意 setJsFile() 和 appendJsFile() 方法的区别:

setJsFile :设置新的JS文件后将清空之前设置的值。也就是后台如果一直 setJsFile,那么只有最后一个js文件生效。

appendJsFile:添加多个js文件将按照添加的先后顺序执行。

2. 文件路径

setJsFile() 和 appendJsFile()方法中所写的文件路径一定要正确

如果文件路径从static目录开始写,比如这样:

javascript 复制代码
wv.setJsFile("static/uni.webview.1.5.5.js")
wv.appendJsFile("static/post.js")

这样写在安卓端没有问题,运行很顺利,但是在 IOS 端就会发现这两个方法所加文件并未生效,所以文件路径一定要写正确,默认带上'_www'****,

javascript 复制代码
wv.setJsFile("_www/static/uni.webview.1.5.5.js")
wv.appendJsFile("_www/static/post.js")

3. setJsFile() 和 appendJsFile()方法所写时机

在渲染时写 setJsFile() 和 appendJsFile()方法,在安卓端不会有任何问题,但在IOS端会发现这两个方法并未生效

因此建议在 IOS 端 setJsFile() 和 appendJsFile() 操作应放在监听 loaded 事件之后

javascript 复制代码
            var currentWebview = this.$scope.$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
			this.wv = currentWebview.children()[0]

			this.wv.addEventListener("loaded", () => {
			    this.wv.setJsFile("_www/static/uni.webview.1.5.5.js")
			    this.wv.appendJsFile("_www/static/post.js")
			    console.log('加载完成');
			    this.getImg() // 加载完成后获取一次验证码图片,但可能获取为空
			}, false);
			

4.setStyle()设置样式只能在APP端生效

只有app可以设置webview的宽高,其他的端是无解的

利用节点信息减去其他内容的高度,得到webview的高度,this.scope.scope.scope.getAppWebview()获取webview实例(只能app使用),再修改实例setStyle设置。

5.层级问题(事件不触发)

在uniapp使用webview时,需要注意样式层级问题,如下代码,若在当前页面使用了webview,则点击时不会触发点击事件,原因就是webview显示层级高于当前页面

解决:添加样式层级:z-index: 999;

html 复制代码
        <view class="privacy">
				<view @click="toPrivacy('user')"><u--text text="机电用户协议" size="12"></u--text></view>、
				<view @click="toPrivacy('privacy')"><u--text text="隐私协议" size="12"></u--text></view>
		</view>
相关推荐
居安思危_Ho10 小时前
RK平台Uniapp自启动缓存问题解决
android·缓存·uni-app·rk平台·uniapp资源文件
你真的可爱呀12 小时前
uniapp学习【项目创建+项目结构解析】
学习·uni-app
小小弯_Shelby12 小时前
uniApp App内嵌H5打开内部链接,返回手势(左滑右滑页面)会直接关闭H5项目
前端·uni-app
卷Java12 小时前
百度AI车牌识别配置指南
java·开发语言·百度·uni-app·dubbo·微信公众平台
游戏开发爱好者815 小时前
苹果iOS26系统升级:液态玻璃与智能功能全解析
macos·ios·小程序·uni-app·objective-c·cocoa·iphone
2501_9159184121 小时前
iOS 26 App 性能测试|性能评测|iOS 26 性能对比:实战策略
android·macos·ios·小程序·uni-app·cocoa·iphone
用户904706683571 天前
uniapp Vue3版本,用pinia存储持久化插件pinia-plugin-persistedstate对微信小程序的配置
前端·uni-app
乔冠宇1 天前
uniapp创建ts项目tsconfig.json报错的问题
uni-app
细节控菜鸡1 天前
【2025最新】uniapp 中基于 request 封装实现多文件上传完整指南
uni-app
fakaifa1 天前
【全开源】企业微信SCRM社群营销高级版系统+uniapp前端
uni-app·开源·企业微信·scrm·源码下载·企业微信scrm