热更新就是打开App时遇到的即时更新,可以免重新下载安装来更新我们app上的内容
下面直接贴 uni-app 热更新步骤~
1:在HBuilder 打包热更需要用到的 wgt 包文件
wgt包上传到你的服务器,让app可以下载
2: 我的服务端代码
<?php
$version = htmlspecialchars($_GET['version']);
$name = htmlspecialchars($_GET['name']);
//todo 此处可以根据用户版本号 app名称 用户uid 来判断要不要让该app更新
$arr = array(
"update" => 1, // 是否更新,1为是 其他为否
"versionCode" => "1.0.1", // 版本号
"description" => "此次为更新测试哦", // 更新描述
"upgradeUrl" => "http://.../...wgt" // 更新地址,就是上个步骤打包的wgt下载地址
);
// 输出json 给客户端
echo json_encode($arr);die;
3:uni-app 的前端代码
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
uni.request({
url: 'http://.../...php', //你的服务端地址,代码在步骤2
data: {
version: widgetInfo.version, // manifest.json 里面的version
name: widgetInfo.name
},
success: (result) => {
var data = result.data;
console.log(data);
// 要更新 且有更新包地址
if (data.update == 1 && data.wgtUrl) {
// 弹出 选择框 让用户选择是否更新,
uni.showModal({
title: '版本更新' + data.versionCode,
content: data.description,
confirmText: "更新",
showCancel: true,
success: function(e) {
if (e.confirm) {
if (plus.os.name.toLowerCase() == 'ios') {
// 跳转到下载页面
// plus.runtime.openURL(data.upgradeUrl)
uni.downloadFile({
url: data.upgradeUrl,
success: (downloadResult) => {
if (downloadResult.statusCode === 200) {
plus.runtime.install(downloadResult.tempFilePath, {
force: true
}, function() {
console.log('install success...');
plus.runtime.restart();
}, function(e) {
console.error('install fail...');
});
}
}
});
} else {
var dtask = plus.downloader.createDownload(
data.upgradeUrl, {},
function(d, status) {
uni.showToast({
title: '下载完成',
mask: false,
duration: 2000
});
console.log(d.filename);
console.log(d.tempFilePath);
console.log(plus.io.convertLocalFileSystemURL(d.filename));
// 下载完成 安装 force 一定要设置为true,更新完成后 重启应用
if (status == 200) {
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename), {
force: true
}, function() {
plus.runtime.restart();
}, function(error) {
uni.showToast({
title: '安装失败-01',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败-02',
mask: false,
duration: 1500
});
}
});
try {
dtask.start(); // 开启下载的任务
var prg = 0;
var showLoading = plus.nativeUI.showWaiting("正在下载"); //创建一个showWaiting对象
dtask.addEventListener('statechanged', function(
task,
status
) {
// 给下载任务设置一个监听 并根据状态 做操作
switch (task.state) {
case 1:
showLoading.setTitle("正在下载");
break;
case 2:
showLoading.setTitle("已连接到服务器");
break;
case 3:
prg = parseInt(
(parseFloat(task.downloadedSize) /
parseFloat(task.totalSize)) *
100
);
showLoading.setTitle(" 正在下载" + prg + "% ");
break;
case 4:
plus.nativeUI.closeWaiting();
//下载完成
break;
}
});
} catch (err) {
plus.nativeUI.closeWaiting();
uni.showToast({
title: '更新失败-03',
mask: false,
duration: 1500
});
}
}
}
}
})
}
}
});
});
这样就可以实现热更拉 不过热更完得重启才能使用,苹果还没试过 安卓亲测 没问题
end~~