我起初的做法是:将版本卸载了vue项目的配置文件中,进入首页的时候对比数据库版本和配置文件中的版本是否一致,如果配置文件中的版本比数据的低,则提示不是最新版本,询问是否更新,点击更新后跳到系统默认浏览器或者指定的浏览器下载。上机测没问题,以为一切完美。
然而,测试人员使用小米手机测试的时候发现,提示无法找到路径,我怀疑的是他的手机不能打开默认浏览器,于是将apk地址改成了随便一个网页地址,继续上机测试,成功跳转到手机浏览器并打开了网页,,,中间尝试过开权限,然而也并无效果。
就这样,开始换个思路。。。不用浏览器下载,直接在app内部进行下载更新,果然,在网上一搜,cordova支持app内部下载apk。完美不?
需要安装的插件如下:在cordova根目录下执行下面命令安装。
//获取app版本号
cordova plugin add cordova-plugin-app-version
//提供一个临时存储文件的地方
cordova plugin add cordova-plugin-file
//实现上传下载
cordova plugin add cordova-plugin-file-transfer
//下载后打开
cordova plugin add cordova-plugin-file-opener2
所有插件都已备齐,下面开始业务开发:
代码如下:
由于我一开始就是使用配置文件来存地址,所以这部分代码没有改。其实可以从cordova的配置文件中获取。
//对比版本
//获取版本检查
getVersion() {
return new Promise((resolve) => {
this.$axios.get(process.env.VUE_APP_USER_SEVER_NAME + '...', {
params: {
type: 1
}
}).then((res) => {
if (res.data.data.version != this.currentVersion) { //有新版本
this.hasNewVersion = true
this.apkId = res.data.data.id
this.newVersionUrl = res.data.data.url //地址
this.newVersionNumber = res.data.data.version //版本号
}
resolve()
})
})
},
//更新版本
updateVersion() {
var url = this.newVersionUrl
var targetPath = cordova.file.externalCacheDirectory + "Download/Pass/" + "test.apk"; //要下载的目标路径及文件名(本地存储路径)
// 初始化FileTransfer对象
var fileTransfer = new FileTransfer();
// 调用download方法
fileTransfer.download(
url, //uri网络下载路径
targetPath, //url本地存储路径
function (entry) {
// console.log("entry: " + entry);
// console.log("download complete: " + entry.toURL());
cordova.plugins.fileOpener2.open(
targetPath,
'application/vnd.android.package-archive',
{
error: function (e) {
console.log('Error status: ' + e.status + ' - Error message: ' + e.message);
Dialog.alert({
title: "打开下载文件失败",
message: "请退出后重新进入应用",
}).then(res => {
navigator.app.exitApp();
})
},
success: function () {
console.log('open successfully');
}
})
},
function (error) {
}
);
//监测下载进度
fileTransfer.onprogress = function (progressEvent) {
if (progressEvent.lengthComputable) {
var downloadProgress = (progressEvent.loaded / progressEvent.total) * 100;
var result = "已下载:" + Math.floor(downloadProgress) + "%";
if (Math.floor(downloadProgress) == 100) {
Dialog.alert({
title: result,
message: "下载完成后会自动弹出安装",
showConfirmButton: false,
showCancelButton: true
}).then(
).catch(() => {
// on cancel
navigator.app.exitApp();
})
} else {
Dialog.alert({
title: result,
message: "下载完成后会自动弹出安装",
showConfirmButton: false,
showCancelButton: false
})
}
}
};
this.showPop = false
},