uni-app 关闭webview之后,plus截屏方法报错

发布于 1周前 作者 itying888 来自 Uni-App

uni-app 关闭webview之后,plus截屏方法报错

信息 内容
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 macOS
HBuilderX类型 Alpha
HBuilderX版本 3.98
手机系统 全部
手机厂商 华为
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

测试过的手机:

  • 苹果
  • 小米

示例代码:

/**
 * 关闭webview
 * @param {Object} data - 请求参数
 * @param {Number} index - webview index
 * @param {Object} wv - webview对象
 */
biz_navigation_close(data, index, wv) {
    let result = JSON.stringify({
        success: true,
        message: 'ok',
        type: 'biz_navigation_close',
    })
    try {
        // const current = this.webViewList[index]
        this.webViewList = this.webViewList.filter((k, i) => i !== index)
        const ws = plus.webview.currentWebview()
        // 这里关闭后  
        plus.webview.close(ws)  
        console.log(plus.webview.all())  
    } catch (e) {
        result = JSON.stringify({
            success: false,
            message: e,
            type: 'biz_navigation_close',
        })
    }
    wv && wv.evalJS(`window.biz_navigation_closeCallback(${result})`)
},
// 截屏绘制方法
let pages = getCurrentPages()
let page = pages[pages.length - 1]
let ws = page.$getAppWebview()
let bitmap = new plus.nativeObj.Bitmap('drawScreen')
// 这个方法报异常 状态码为-99
ws.draw(bitmap, () => {})

操作步骤:

  • 打开一个web view,然后关闭,调用代码节选中的ws.draw() 方法报错,状态码是-99

预期结果:

  • 能够正常运行

实际结果:

bug描述:

  • 如题。

2 回复

let ws = plus.webview.currentWebview() let bitmap = new plus.nativeObj.Bitmap(‘drawScreen’)
ws.draw(
bitmap,
() => {})
则是白屏


在使用 uni-app 开发时,如果你在关闭 Webview 后调用 plus.screen 的截屏方法(如 plus.screen.capture),可能会遇到报错。这通常是因为 Webview 被关闭后,相关的 Webview 对象已经被销毁,导致 plus.screen 方法无法正常执行。

解决方案

  1. 确保 Webview 存在: 在调用 plus.screen.capture 之前,确保 Webview 仍然存在并且没有被关闭。你可以在调用截屏方法之前检查 Webview 的状态。

    let webview = plus.webview.currentWebview();
    if (webview && !webview.isClosed()) {
        plus.screen.capture(function(success) {
            console.log('截屏成功', success);
        }, function(error) {
            console.log('截屏失败', error);
        });
    } else {
        console.log('Webview 已关闭,无法截屏');
    }
  2. 延迟执行截屏: 如果你在关闭 Webview 后立即调用截屏方法,可能会导致报错。你可以尝试延迟执行截屏操作,确保 Webview 已经完全关闭。

    setTimeout(function() {
        plus.screen.capture(function(success) {
            console.log('截屏成功', success);
        }, function(error) {
            console.log('截屏失败', error);
        });
    }, 1000); // 延迟1秒执行
  3. 监听 Webview 关闭事件: 如果你需要在 Webview 关闭后执行某些操作,可以监听 Webview 的关闭事件,并在事件回调中执行截屏操作。

    let webview = plus.webview.currentWebview();
    webview.addEventListener('close', function() {
        plus.screen.capture(function(success) {
            console.log('截屏成功', success);
        }, function(error) {
            console.log('截屏失败', error);
        });
    });
  4. 使用全局变量存储 Webview 状态: 你可以在关闭 Webview 时设置一个全局变量来标记 Webview 的状态,然后在调用截屏方法时检查这个变量。

    let isWebviewClosed = false;
    
    function closeWebview() {
        let webview = plus.webview.currentWebview();
        webview.close();
        isWebviewClosed = true;
    }
    
    function captureScreen() {
        if (!isWebviewClosed) {
            plus.screen.capture(function(success) {
                console.log('截屏成功', success);
            }, function(error) {
                console.log('截屏失败', error);
            });
        } else {
            console.log('Webview 已关闭,无法截屏');
        }
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!