uni-app 偶发不调用安装问题:plus.downloader.createDownload 下载最新文件后,plus.runtime.install 进行安装出现偶发不调用安装
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 进行安装,但是会出现偶尔的安装不了的情况,并不是每次都会出现,同样的机器上面,也不是固定某一个机型,不知道有什么办法能检查出这种问题,因为是生产环境,所以没法调试,本地调试过几十次都未能出现一次
附件图片
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
事件来跟踪下载进度,并在下载完成后尝试安装。同时,通过捕获异常和监听运行时错误事件来增强代码的健壮性。在实际应用中,根据具体需求调整保存路径、错误处理逻辑等。此外,确保在真机环境下测试,因为模拟器可能无法完全模拟所有行为。