增加版本信息获取工具类.

可以在项目代码中直接使用 import um = require('UpdateManager') 然后调用相关接口.
This commit is contained in:
andrewlu 2021-02-03 21:34:58 +08:00
parent ae6566c8dd
commit ef915a121e
10 changed files with 201 additions and 84 deletions

View File

@ -105,7 +105,7 @@
"_contentSize": { "_contentSize": {
"__type__": "cc.Size", "__type__": "cc.Size",
"width": 700, "width": 700,
"height": 255.6 "height": 75.6
}, },
"_anchorPoint": { "_anchorPoint": {
"__type__": "cc.Vec2", "__type__": "cc.Vec2",
@ -117,7 +117,7 @@
"ctor": "Float64Array", "ctor": "Float64Array",
"array": [ "array": [
0, 0,
0, 282.58,
0, 0,
0, 0,
0, 0,
@ -156,9 +156,9 @@
], ],
"_srcBlendFactor": 770, "_srcBlendFactor": 770,
"_dstBlendFactor": 771, "_dstBlendFactor": 771,
"_string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V4", "_string": "",
"_N$string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V4", "_N$string": "",
"_fontSize": 60, "_fontSize": 30,
"_lineHeight": 60, "_lineHeight": 60,
"_enableWrapText": true, "_enableWrapText": true,
"_N$file": null, "_N$file": null,
@ -193,8 +193,9 @@
"__id__": 1 "__id__": 1
}, },
"_enabled": true, "_enabled": true,
"label": null, "label": {
"text": "hello", "__id__": 3
},
"_id": "" "_id": ""
}, },
{ {

View File

@ -1,28 +1,21 @@
// Learn TypeScript:
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
const {ccclass, property} = cc._decorator; const {ccclass, property} = cc._decorator;
//@ts-ignore
import UpdateManager = require('UpdateManager');
@ccclass @ccclass
export default class NewClass extends cc.Component { export default class NewClass extends cc.Component {
@property(cc.Label) @property(cc.Label)
label: cc.Label = null; label: cc.Label = null;
@property start() {
text: string = 'hello'; if (UpdateManager.getUpdateFlag()) {
this.label.string = UpdateManager.cur_ver_desc;
// LIFE-CYCLE CALLBACKS: UpdateManager.resetUpdateFlag();
} else {
// onLoad () {} this.label.string = "未发现新版本,\n当前版本:" + UpdateManager.cur_ver_name;
}
start () { console.log('>>>>>>>>>>>>>>>>>>>>>', UpdateManager.cur_ver_code);
} }
// update (dt) {}
} }

View File

@ -79,11 +79,11 @@ class FileUploader {
if (this.ftps[i].totalTasks && !this.ftps[i].idleState) { if (this.ftps[i].totalTasks && !this.ftps[i].idleState) {
p = (this.ftps[i].totalTasks - this.ftps[i].queue.length) / this.ftps[i].totalTasks; p = (this.ftps[i].totalTasks - this.ftps[i].queue.length) / this.ftps[i].totalTasks;
} }
p = Math.floor(p * 10000) / 100; p = parseFloat((Math.floor(p * 10000) / 100).toFixed(2));
str.push({ str.push({
name: i, name: i,
idle: this.ftps[i].idleState, idle: this.ftps[i].idleState,
remain: this.ftps[i].queue.length, remain: this.ftps[i].getTaskLength(),
hasError: this.ftps[i].hasError, hasError: this.ftps[i].hasError,
totalTasks: this.ftps[i].totalTasks, totalTasks: this.ftps[i].totalTasks,
curTaskPath: this.ftps[i].curTaskPath, curTaskPath: this.ftps[i].curTaskPath,
@ -240,7 +240,15 @@ class UploadThread {
uploadOnce(ftp, once) { uploadOnce(ftp, once) {
return Promise.race([new Promise(function (resolve) { return Promise.race([new Promise(function (resolve) {
ftp.put(once.src, once.dst, false, resolve) fs.readFile(once.src, (err, data) => {
if (err) {
logger.error('文件读取异常:', once.src, err);
resolve(err)
return
} else {
ftp.put(data, once.dst, false, resolve)
}
});
}), this.sleep(20000)]); }), this.sleep(20000)]);
} }

View File

@ -34,15 +34,13 @@ class FileUtil {
* @param src * @param src
* @param dst * @param dst
*/ */
copy(src, dst) { async copy(src, dst) {
const st = fs.statSync(src); const st = fs.statSync(src);
if (st.isFile()) { if (st.isFile()) {
var readable = fs.createReadStream(src);//创建读取流 const readable = fs.createReadStream(src);//创建读取流
var writable = fs.createWriteStream(dst);//创建写入流 const writable = fs.createWriteStream(dst);//创建写入流
readable.pipe(writable); readable.pipe(writable);
return; return;
} else if (!st.isDirectory()) {
return;
} }
if (!fs.existsSync(dst)) { if (!fs.existsSync(dst)) {
fs.mkdirSync(dst, {recursive: true}); fs.mkdirSync(dst, {recursive: true});
@ -56,7 +54,6 @@ class FileUtil {
write(filePath, content) { write(filePath, content) {
const pathInfo = path.parse(filePath); const pathInfo = path.parse(filePath);
// console.log('写文件:', filePath, pathInfo.dir)
if (!fs.existsSync(pathInfo.dir)) { if (!fs.existsSync(pathInfo.dir)) {
fs.mkdirSync(pathInfo.dir, {recursive: true}); fs.mkdirSync(pathInfo.dir, {recursive: true});
} }

View File

@ -0,0 +1,129 @@
/**
* 方便直接获取当前版本号等信息.
* 使用方式:
* // @ts-ignore
* import UpdateManager = require( "UpdateManager");
* 然后在代码中直接使用即可.
*/
class UpdateManager {
cur_ver_code = 0;
cur_ver_name = "1.0.1";
cur_ver_desc = "";
ver_type = "dev";
new_ver_code = 0;
new_ver_name = "1.0.1";
new_ver_desc = "";
new_ver_info = {};
// 记录当前版本的bundles. 如果有新版本, 则自动下载新bundles.
cur_bundles = {};
updateSuccess = "0";
constructor() {
const curVer = window.localStorage.getItem("cur_ver_info");
if (curVer) {
const verInfo = JSON.parse(curVer);
this.new_ver_code = this.cur_ver_code = verInfo.versionCode;
this.new_ver_name = this.cur_ver_name = verInfo.versionName;
this.ver_type = verInfo.versionType;
this.new_ver_desc = this.cur_ver_desc = verInfo.versionLog;
this.new_ver_info = verInfo;
this.cur_bundles = verInfo.bundleVers;
}
this.updateSuccess = window.localStorage.getItem("ver_updated") || 0;
this.fetchNewVerInfo();
}
// 此方法适用于非强制更新包. 需要设计信息界面,显示版本信息.
// 手动调用进行更新下载, 下载完成返回true, 此时需要重启游戏才能应用更新. 需要界面提示用户.
doUpdate() {
if (this.hasNewVersion()) {
window.localStorage.setItem('cur_ver_info', JSON.stringify(this.new_ver_info));
return true;
}
return false;
}
resetUpdateFlag() {
window.localStorage.setItem('ver_updated', '0');
}
getUpdateFlag() {
return this.updateSuccess == 1;
}
// 检测是否有新版本.
hasNewVersion() {
return this.new_ver_info && this.new_ver_info.versionCode && this.new_ver_info.versionCode != this.cur_ver_code;
}
fetchNewVerInfo() {
let url = window.updateUrl || false;
if (!url) {
return;
}
// 游戏启动后再请求更新,避免影响启动速度.
url += `?_t=${Math.random()}`;
cc.log("请求更新地址:", url);
this._get(url).then(version => {
if (!version) {
console.log("未检测到更新版本内容");
return;
}
if (version) {
cc.log('当前版本号:', this.cur_ver_code, this.cur_ver_name);
cc.log('请求更新内容:', version);
let verInfo = version;
if (typeof version === 'string') {
verInfo = JSON.parse(version);
}
this.new_ver_code = verInfo.versionCode;
this.new_ver_name = verInfo.versionName;
this.new_ver_desc = verInfo.versionLog;
this.new_ver_info = verInfo;
// 如果首次运行,本地未缓存版本信息,则进行缓存.
if (!this.cur_ver_code) {
cc.log("当前首次运行,记录版本信息");
window.localStorage.setItem('cur_ver_info', JSON.stringify(this.new_ver_info));
this.new_ver_code = this.cur_ver_code = verInfo.versionCode;
this.new_ver_name = this.cur_ver_name = verInfo.versionName;
this.ver_type = verInfo.versionType;
this.new_ver_desc = this.cur_ver_desc = verInfo.versionLog;
} else if (this.hasNewVersion() && verInfo.forceUpdate) {
window.localStorage.setItem('cur_ver_info', JSON.stringify(this.new_ver_info));
window.localStorage.setItem('ver_updated', '1');
cc.log("有新版本,且默认强制更新");
}
}
});
}
// ajax 请求.
_get(url) {
return new Promise(resolve => {
const ajax = new XMLHttpRequest();
ajax.open("get", url, true);
ajax.setRequestHeader("Content-Type", "application/json;charset=utf-8");
ajax.onreadystatechange = function () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
resolve(ajax.responseText);
} else {
resolve(null);
}
}
}
ajax.send(null);
});
}
}
module.exports = new UpdateManager();

View File

@ -0,0 +1,9 @@
{
"ver": "1.0.8",
"uuid": "aa7483f4-ac0c-4809-9c5e-4e5734a26db6",
"isPlugin": false,
"loadPluginInWeb": true,
"loadPluginInNative": true,
"loadPluginInEditor": false,
"subMetas": {}
}

View File

@ -45,9 +45,12 @@ const saveNewVersionInfo = function (opt, bundleVers, configJson) {
const data = { const data = {
versionCode: configJson.versionCfg.versionCode, versionCode: configJson.versionCfg.versionCode,
versionName: configJson.versionCfg.versionName, versionName: configJson.versionCfg.versionName,
versionType: configJson.versionCfg.versionType,
versionLog: configJson.versionCfg.versionLog,
forceUpdate: configJson.versionCfg.forceUpdate,
server: `${configJson.versionCfg.baseUrl}${configJson.ftpCfg.rootPath}${configJson.versionCfg.versionType}/${configJson.versionCfg.versionCode}` server: `${configJson.versionCfg.baseUrl}${configJson.ftpCfg.rootPath}${configJson.versionCfg.versionType}/${configJson.versionCfg.versionCode}`
}; };
const updateInfo = Object.assign(data, {bundles: bundleVers}) const updateInfo = Object.assign(data, {bundles: bundleVers});
// 将版本更新信息写入文件 // 将版本更新信息写入文件
let targetUpdatePath = join(opt.dest, `remote/update-${configJson.versionCfg.versionType}.json`) let targetUpdatePath = join(opt.dest, `remote/update-${configJson.versionCfg.versionType}.json`)
FileUtil.write(targetUpdatePath, JSON.stringify(updateInfo, null, 2)); FileUtil.write(targetUpdatePath, JSON.stringify(updateInfo, null, 2));
@ -84,7 +87,7 @@ module.exports = {
Editor.Builder.removeListener('build-finished', doMakeUpdatePackage); Editor.Builder.removeListener('build-finished', doMakeUpdatePackage);
if (this.ftp) { if (this.ftp) {
this.ftp.destroy(); this.ftp.destroy();
this.ftp = null; this.ftp = null;
} }
}, },
messages: { messages: {

View File

@ -9,6 +9,15 @@
"message": "update-manager:open" "message": "update-manager:open"
} }
}, },
"runtime-resource": {
"path": "./lib",
"name": "lib"
},
"reload": {
"ignore": [
"lib/**/*"
]
},
"panel": { "panel": {
"main": "panel/index.html", "main": "panel/index.html",
"type": "simple", "type": "simple",

View File

@ -28,21 +28,14 @@
<el-input v-model="versionCfg.versionType" placeholder="dev"></el-input> <el-input v-model="versionCfg.versionType" placeholder="dev"></el-input>
</el-form-item> </el-form-item>
</el-tooltip> </el-tooltip>
<!--<el-form-item label="其他设置:">--> <el-form-item label="强更开关:">
<!--<el-tooltip content="开启时将强制更新用户端版本" placement="top">--> <el-tooltip content="开启时将强制更新用户端版本" placement="top">
<!--<el-switch v-model="versionCfg.forceUpdate"--> <el-switch v-model="versionCfg.forceUpdate"
<!--:active-text="versionCfg.forceUpdate?'强制静默更新':'用户决定更新'"--> :active-text="versionCfg.forceUpdate?'强制静默更新':'手动检测更新'"
<!--active-color="#13ce66" inactive-color="#ff4949"--> active-color="#13ce66" inactive-color="#ff4949"
<!--style="margin-right: 20px;"></el-switch>--> style="margin-right: 20px;"></el-switch>
<!--</el-tooltip>--> </el-tooltip>
</el-form-item>
<!--<el-tooltip placement="top">-->
<!--<div slot="content">开启时将在每次启动时直接请求更新信息<br/>否则将在进入游戏后才请求更新信息</div>-->
<!--<el-switch v-model="versionCfg.updateMoment"-->
<!--:active-text="versionCfg.updateMoment?'每次启动时更新':'二次启动时更新'"-->
<!--active-color="#13ce66" inactive-color="#ff4949"></el-switch>-->
<!--</el-tooltip>-->
<!--</el-form-item>-->
<el-tooltip effect="dark" :content="tip.baseUrl" open-delay=500 placement="top"> <el-tooltip effect="dark" :content="tip.baseUrl" open-delay=500 placement="top">
<el-form-item label="热更地址:"> <el-form-item label="热更地址:">
<el-input v-model="versionCfg.baseUrl" <el-input v-model="versionCfg.baseUrl"
@ -207,7 +200,7 @@
versionType: "dev", versionType: "dev",
versionLog: "", versionLog: "",
baseUrl: "", baseUrl: "",
// forceUpdate: true, // 强制静默更新. forceUpdate: true, // 强制静默更新.
// updateMoment: true // 启动时直接请求更新. // updateMoment: true // 启动时直接请求更新.
}, },
ftpCfg: { ftpCfg: {

View File

@ -1,9 +1,9 @@
window.beforeBoot = function () { window.beforeBoot = function () {
cc.log("游戏正在启动中.") // console.log("游戏正在启动中.")
if (window.remoteUrl) { if (window.remoteUrl) {
const settings = window._CCSettings; const settings = window._CCSettings;
settings.server = window.remoteUrl; settings.server = window.remoteUrl;
cc.log("远程资源地址:", settings.server); //cc.log("远程资源地址:", settings.server);
} }
let url = window.updateUrl || false; let url = window.updateUrl || false;
if (!url) { if (!url) {
@ -13,56 +13,31 @@ window.beforeBoot = function () {
} }
// 请求缓存信息,判断是否需要更新. // 请求缓存信息,判断是否需要更新.
let assetStr = window.localStorage.getItem('version_data'); let assetStr = window.localStorage.getItem('cur_ver_info');
if (!assetStr) { if (!assetStr) {
window.boot(); window.boot();
} else { } else {
// console.log("当前版本信息:", assetStr);
let asset = JSON.parse(assetStr); let asset = JSON.parse(assetStr);
window.mergeVersion(asset); window.mergeVersion(asset);
window.boot(); window.boot();
} }
// 游戏启动后再请求更新,避免影响启动速度.
url += `?_t=${Math.random()}`;
cc.log("请求更新地址:", url);
get(url, function (err, asset) {
if (err || !asset) {
return;
}
window.localStorage.setItem('version_data', asset);
});
}; };
window.mergeVersion = function (updateInfo) { window.mergeVersion = function (updateInfo) {
const settings = window._CCSettings; const settings = window._CCSettings;
const bundleVers = updateInfo.bundles; const bundleVers = updateInfo.bundles;
settings.server = updateInfo.server;
if (bundleVers) { if (bundleVers) {
for (let b in bundleVers) { for (let b in bundleVers) {
if (bundleVers[b] != settings.bundleVers[b]) { if (bundleVers[b] != settings.bundleVers[b]) {
// 配置中的bundleVer版本不一致,则添加到remote列表中去,以供远程加载. // 配置中的bundleVer版本不一致,则添加到remote列表中去,以供远程加载.
if (settings.remoteBundles.indexOf(b) < 0) { if (settings.remoteBundles.indexOf(b) < 0) {
settings.remoteBundles.push(b); settings.remoteBundles.push(b);
console.log('bundle 有更新:', b, bundleVers[b]);
} }
} }
} }
settings.bundleVers = bundleVers; settings.bundleVers = bundleVers;
} }
return; };
}
// ajax 请求.
function get(url, cb) {
const ajax = new XMLHttpRequest();
ajax.open("get", url, true);
ajax.setRequestHeader("Content-Type", "application/json;charset=utf-8");
ajax.onreadystatechange = function () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
// var response = JSON.parse(ajax.responseText)
cb && cb(null, ajax.responseText);
return;
} else {
cb && cb("request error!");
}
}
}
ajax.send(null);
}