uni-app 偶发不调用安装问题:plus.downloader.createDownload 下载最新文件后,plus.runtime.install 进行安装出现偶发不调用安装

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

uni-app 偶发不调用安装问题:plus.downloader.createDownload 下载最新文件后,plus.runtime.install 进行安装出现偶发不调用安装

示例代码:

downloader(downloadUrl) {
    let that = this;
    // console.log(downloadUrl);
    that.showper = true;
    plus.downloader.clear(); //清除下载任务
    let dtask = plus.downloader.createDownload(
        downloadUrl, {
            filename: that.vuex_config.UrlDown_apk
        },
        (d, status) => {
            // 下载完成
            if (status == 200) {
                uni.showToast({
                    title: " Download file sucess " + d.filename,
                    mask: false,
                    duration: 1000,
                });
                let installurl = plus.io.convertLocalFileSystemURL(d.filename);
                uni.showToast({
                    title: " File local path " + installurl,
                    mask: false,
                    duration: 3500,
                });
                plus.runtime.install(installurl, {}, {},
                    (error) => {
                        uni.showToast({
                            title: that.$t("common.InstallFailed"),
                            mask: false,
                            duration: 3500,
                        });
                    }
                );
            } else {
                uni.showToast({
                    title: that.$t("common.InstallFailed"),
                    mask: false,
                    duration: 3500,
                });
                plus.downloader.clear(); //清除下载任务
            }  
        }
    );

    dtask.addEventListener("statechanged", (download, status) => {
        switch (download.state) {
            case 1:
                uni.showToast({
                    title: that.$t("common.Downloading"),
                });
                break;
            case 2:
                // console.log("链接到服务器...");
                break;
            case 3:
                this.downcurrentSize = download.downloadedSize;
                this.downtotalSize = download.totalSize;
                this.percent = parseInt(
                    (parseFloat(this.downcurrentSize) /
                        parseFloat(this.downtotalSize)) * 100);
                // console.log("下载文件百分比..." + this.percent);
                //显示的回调函数
                // if(cb2) cb2()
                break;
            case 4:
                // console.log("监听下载完成");
                plus.nativeUI.closeWaiting();
                //回调函数
                // if(cb2) cb2()
                break;
        }
    });
    dtask.start();
}

操作步骤:

因为是偶发现象,无法准确的重现步骤

预期结果:

应该要正常的都能弹出安装页面

实际结果:

实际下载完成后就不动了

bug描述:

使用plus.downloader.createDownload 下载最新的文件,plus.runtime.install 进行安装,但是会出现偶尔的安装不了的情况,并不是每次都会出现,同样的机器上面,也不是固定某一个机型,不知道有什么办法能检查出这种问题,因为是生产环境,所以没法调试,本地调试过几十次都未能出现一次

附件图片

Image 1

Image 2


1 回复

在uni-app开发中,处理plus.downloader.createDownload下载文件后使用plus.runtime.install进行安装时遇到的偶发不调用安装问题,通常与异步处理、事件监听及错误处理有关。以下是一个示例代码,展示了如何更稳妥地管理下载和安装流程,并包含了一些常见的调试和错误处理策略。

// 假设我们要下载并安装一个APK文件
const downloadUrl = 'https://example.com/path/to/your.apk';
const savePath = '_www/download/your.apk'; // 保存路径,确保该目录存在或可写

// 创建下载任务
const downloader = plus.downloader.createDownload(downloadUrl, {}, (task, status) => {
    if (status === 200) { // 下载完成
        console.log('Download completed successfully.');
        // 开始安装
        plus.runtime.install(savePath, {}, (event, status) => {
            if (status === 0) {
                console.log('Installation started successfully.');
            } else {
                console.error('Installation failed with status code:', status);
            }
        });
    } else {
        console.error('Download failed with status code:', status);
    }
});

// 监听下载进度
downloader.addEventListener('statechanged', (event) => {
    const percent = parseInt((event.downloadedSize / event.totalSize) * 100, 10);
    console.log(`Download progress: ${percent}%`);
});

// 开始下载
downloader.start();

// 错误处理,确保捕获所有可能的异常
try {
    downloader.start();
} catch (error) {
    console.error('An error occurred while starting the download:', error);
    // 可根据需要重试下载或通知用户
}

// 额外的调试信息,可以通过监听plus.runtime的错误事件来获取更多信息
plus.runtime.addEventListener('error', (event) => {
    console.error('Runtime error:', event.msg);
});

// 注意事项:
// 1. 确保APK文件路径正确,且设备有权限写入该路径。
// 2. 在真机测试时,检查是否有足够的存储空间。
// 3. 对于Android平台,确保应用有安装未知来源应用的权限。
// 4. 考虑网络状况,可能需要实现重试机制。

上述代码通过监听下载任务的statechanged事件来跟踪下载进度,并在下载完成后尝试安装。同时,通过捕获异常和监听运行时错误事件来增强代码的健壮性。在实际应用中,根据具体需求调整保存路径、错误处理逻辑等。此外,确保在真机环境下测试,因为模拟器可能无法完全模拟所有行为。

回到顶部