朋友,你是否天天更新前端几点鸡毛蒜皮代码,就要重新云打包一次。
朋友,你是否流量不够多,每次更新功能就要下一次APP。
朋友,你是否失眠过多,经常掉发?
集美们,魔鬼来咯。他来了他来了!偶买噶,热更新他来了。
Uni在APP.vue 生命周期钩子onLaunch中进行设备判断,
判断为手机,获取手机APPID,设备版本号。设备类型[安卓,苹果],那什么时候进行热更新,什么时候进行重更新呢?
重更新:服务端v2.1.103 客户端v1.1.103
热更新:服务端v1.1.104 客户端v1.1.103
uni打包wgt发给后端放在线上。
注意!!!热更新必须为打包后的APP安装版本,真机调试无效!机调试无效!调试无效!
前端代码块-App.vue
onLaunch: function() {
// #ifdef APP-PLUS
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
console.log(widgetInfo);
uni.request({
url: '不为人知的请求接口',
data: {
appid: widgetInfo.appid,
version: widgetInfo.version,
name: plus.os.name
},
success: res => {
console.log(res);
if (res.data.code == 200) {
console.log(res);
// 重大更新
if (res.data.data.status == '1') {
uni.showModal({
//提醒用户更新
title: '更新提示',
content: res.data.note,
success: res => {
if (res.confirm) {
plus.runtime.openURL(res.data.url);
}
}
});
}
// 热更新
if (res.data.data.status == '2') {
console.log('热更新');
//调用uni-downloadFile方法,具体可看API文档。
uni.downloadFile({
url: res.data.data.url,
success: downloadResult => {
if (downloadResult.statusCode === 200) {
console.log(downloadResult.tempFilePath);
plus.runtime.install(
downloadResult.tempFilePath,
{
force: false
},
function() {
console.log('install success...');
plus.runtime.restart();
},
function(e) {
console.error('install fail...');
}
);
}
},
fail: err => {
console.log(err);
console.log('热更新失败');
}
});
}
}
}
});
});
// #endif
}
后端代码块(Php)
//服务端配置APP 更新参数 ($app_info["version"] 版本号 $app_info['id'] APP对应APPID )
$app_info = config('app.APP_INFO');
$appid = $data["appid"]; //客户端APPID
$version = $data["version"]; //客户端版本号
$name = $data['name']; //客户端设备
//判断更新类型
//取出版本号重大更新标签 比如 1.2.101 取出1
$data_num = substr($data["version"],0,1);
$app_num = substr($app_info["version"],0,1);
if ($data["version"] == $app_info["version"]){
//如果两个版本号一致,表示不更新
$rsp["status"] = 0;
}else if ($app_num - $data_num >= 1){
//当两个版本号重大更新标签 相差大于或等于的时候 表示有重大更新
$rsp["status"] = 1;
}else if ($app_num - $data_num == 0){
//其余不相等的为热更新,这里可以详细判断,但是没必要
$rsp["status"] = 2;
}
if (isset($appid) && isset($version)) {
if ($appid === $app_info['id']) { //校验appid
if ($version !== $app_info['version']) { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中
// 1为整包更新,2为热更新
if($rsp["status"]==1){
$rsp["note"] = "修复bug1;\n修复bug2;"; //release notes
if ($name=="Android") {
$rsp["url"] = ""; // Android下载地址
}else{
$rsp["url"] = ""; // IOS下载地址
}
}else if ($rsp["status"]==2){
$rsp["url"]= ''; // 热更新包
}
}
}
}