uni-app APP端使用web-view时 web-view中内容卡死后 退出web-view页面 app其他界面也都无法操作
uni-app APP端使用web-view时 web-view中内容卡死后 退出web-view页面 app其他界面也都无法操作
| 信息类别 | 详细信息 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境操作系统 | Windows |
| PC开发环境操作系统版本号 | win10 专业版 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 3.1.11 |
| 手机系统 | 全部 |
| 手机厂商 | 华为 |
| 页面类型 | vue |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
测试过的手机
华为 Honor 8 iphone6 plus
示例代码:
<template>
<view>
</view>
</template>
<script>
var wv;//计划创建的webview
export default {
onLoad(option) {
let title = option.name;
uni.setNavigationBarTitle({
title: title,
})
// #ifdef APP-PLUS
wv = plus.webview.create("","custom-webview",{
plusrequire:"none", //禁止远程网页使用plus的API,有些使用mui制作的网页可能会监听plus.key,造成关闭页面混乱,可以通过这种方式禁止
'uni-app': 'none', //不加载uni-app渲染层框架,避免样式冲突
top:uni.getSystemInfoSync().statusBarHeight+44, //放置在titleNView下方。如果还想在webview上方加个地址栏的什么的,可以继续降低TOP值
height:uni.getSystemInfoSync().windowHeight
})
var url = uni.getStorageSync("url");
wv.loadURL(url);
var currentWebview = this.$scope.$getAppWebview(); //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效,非v3编译模式使用this.$mp.page.$getAppWebview()
currentWebview.append(wv);//一定要append到当前的页面里!!!才能跟随当前页面一起做动画,一起关闭
setTimeout(function() {
wv.setStyle({height:uni.getSystemInfoSync().windowHeight})
}, 1000); //如果是页面初始化调用时,需要延时一下
// #endif
};
</script>
操作步骤:
暂无
预期结果:
除web-view页面外依旧可以使用,而不是需要退出重新打开
实际结果:
整个app均无法使用,需要重新打开才可以操作
bug描述:
代码示例中是所有第三方页面的加载vue文件内容,当加载某些页面时,由于数据大小原因,可能导致页面卡死,点击无反应,点击返回按钮之后,其他页面均无反应。
更多关于uni-app APP端使用web-view时 web-view中内容卡死后 退出web-view页面 app其他界面也都无法操作的实战教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于uni-app APP端使用web-view时 web-view中内容卡死后 退出web-view页面 app其他界面也都无法操作的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个典型的WebView内存泄漏导致的UI线程阻塞问题。在uni-app的APP端,当WebView加载复杂内容或内存占用过高时,可能会阻塞整个应用的UI线程。
问题分析:
- WebView卡死后,其渲染进程可能占用了大量系统资源
- 原生WebView组件与uni-app运行在同一进程,WebView的崩溃会影响主应用
- 即使退出WebView页面,相关的WebView实例可能没有被正确销毁
解决方案:
- 添加WebView生命周期管理
onUnload() {
// #ifdef APP-PLUS
if(wv){
wv.close();
wv = null;
}
// #endif
}
- 设置WebView内存优化参数
wv = plus.webview.create("","custom-webview",{
plusrequire:"none",
'uni-app': 'none',
top:uni.getSystemInfoSync().statusBarHeight+44,
height:uni.getSystemInfoSync().windowHeight,
hardwareAccelerated: true // 开启硬件加速
})
- 添加异常处理机制
wv.addEventListener('error', function(e){
console.log('WebView加载错误:', e);
wv.close();
});
- 使用定时器检测WebView状态
let timeoutTimer = setTimeout(() => {
if(wv && !wv.isVisible()) {
wv.close();
uni.navigateBack();
}
}, 5000);

