diff --git a/assets/Bundle2/UI2.prefab b/assets/Bundle2/UI2.prefab
index 46a1bc9..9435981 100644
--- a/assets/Bundle2/UI2.prefab
+++ b/assets/Bundle2/UI2.prefab
@@ -105,7 +105,7 @@
"_contentSize": {
"__type__": "cc.Size",
"width": 700,
- "height": 255.6
+ "height": 75.6
},
"_anchorPoint": {
"__type__": "cc.Vec2",
@@ -117,7 +117,7 @@
"ctor": "Float64Array",
"array": [
0,
- 0,
+ 282.58,
0,
0,
0,
@@ -156,9 +156,9 @@
],
"_srcBlendFactor": 770,
"_dstBlendFactor": 771,
- "_string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V4",
- "_N$string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V4",
- "_fontSize": 60,
+ "_string": "",
+ "_N$string": "",
+ "_fontSize": 30,
"_lineHeight": 60,
"_enableWrapText": true,
"_N$file": null,
@@ -193,8 +193,9 @@
"__id__": 1
},
"_enabled": true,
- "label": null,
- "text": "hello",
+ "label": {
+ "__id__": 3
+ },
"_id": ""
},
{
diff --git a/assets/Bundle2/UI2.ts b/assets/Bundle2/UI2.ts
index 367a0fa..67a8e19 100644
--- a/assets/Bundle2/UI2.ts
+++ b/assets/Bundle2/UI2.ts
@@ -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;
+//@ts-ignore
+import UpdateManager = require('UpdateManager');
+
@ccclass
export default class NewClass extends cc.Component {
@property(cc.Label)
label: cc.Label = null;
- @property
- text: string = 'hello';
-
- // LIFE-CYCLE CALLBACKS:
-
- // onLoad () {}
-
- start () {
-
+ start() {
+ if (UpdateManager.getUpdateFlag()) {
+ this.label.string = UpdateManager.cur_ver_desc;
+ UpdateManager.resetUpdateFlag();
+ } else {
+ this.label.string = "未发现新版本,\n当前版本:" + UpdateManager.cur_ver_name;
+ }
+ console.log('>>>>>>>>>>>>>>>>>>>>>', UpdateManager.cur_ver_code);
}
-
- // update (dt) {}
}
diff --git a/packages/update-manager/js/FileUploader.js b/packages/update-manager/js/FileUploader.js
index 1b8540b..41ed34e 100644
--- a/packages/update-manager/js/FileUploader.js
+++ b/packages/update-manager/js/FileUploader.js
@@ -79,11 +79,11 @@ class FileUploader {
if (this.ftps[i].totalTasks && !this.ftps[i].idleState) {
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({
name: i,
idle: this.ftps[i].idleState,
- remain: this.ftps[i].queue.length,
+ remain: this.ftps[i].getTaskLength(),
hasError: this.ftps[i].hasError,
totalTasks: this.ftps[i].totalTasks,
curTaskPath: this.ftps[i].curTaskPath,
@@ -240,7 +240,15 @@ class UploadThread {
uploadOnce(ftp, once) {
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)]);
}
diff --git a/packages/update-manager/js/FileUtils.js b/packages/update-manager/js/FileUtils.js
index 4461117..6992f07 100644
--- a/packages/update-manager/js/FileUtils.js
+++ b/packages/update-manager/js/FileUtils.js
@@ -34,15 +34,13 @@ class FileUtil {
* @param src
* @param dst
*/
- copy(src, dst) {
+ async copy(src, dst) {
const st = fs.statSync(src);
if (st.isFile()) {
- var readable = fs.createReadStream(src);//创建读取流
- var writable = fs.createWriteStream(dst);//创建写入流
+ const readable = fs.createReadStream(src);//创建读取流
+ const writable = fs.createWriteStream(dst);//创建写入流
readable.pipe(writable);
return;
- } else if (!st.isDirectory()) {
- return;
}
if (!fs.existsSync(dst)) {
fs.mkdirSync(dst, {recursive: true});
@@ -56,7 +54,6 @@ class FileUtil {
write(filePath, content) {
const pathInfo = path.parse(filePath);
- // console.log('写文件:', filePath, pathInfo.dir)
if (!fs.existsSync(pathInfo.dir)) {
fs.mkdirSync(pathInfo.dir, {recursive: true});
}
diff --git a/packages/update-manager/lib/UpdateManager.js b/packages/update-manager/lib/UpdateManager.js
new file mode 100644
index 0000000..cb5be34
--- /dev/null
+++ b/packages/update-manager/lib/UpdateManager.js
@@ -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();
\ No newline at end of file
diff --git a/packages/update-manager/lib/UpdateManager.js.meta b/packages/update-manager/lib/UpdateManager.js.meta
new file mode 100644
index 0000000..7104b18
--- /dev/null
+++ b/packages/update-manager/lib/UpdateManager.js.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.0.8",
+ "uuid": "aa7483f4-ac0c-4809-9c5e-4e5734a26db6",
+ "isPlugin": false,
+ "loadPluginInWeb": true,
+ "loadPluginInNative": true,
+ "loadPluginInEditor": false,
+ "subMetas": {}
+}
\ No newline at end of file
diff --git a/packages/update-manager/main.js b/packages/update-manager/main.js
index ea739fb..b0c3d9c 100644
--- a/packages/update-manager/main.js
+++ b/packages/update-manager/main.js
@@ -45,9 +45,12 @@ const saveNewVersionInfo = function (opt, bundleVers, configJson) {
const data = {
versionCode: configJson.versionCfg.versionCode,
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}`
};
- 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`)
FileUtil.write(targetUpdatePath, JSON.stringify(updateInfo, null, 2));
@@ -84,7 +87,7 @@ module.exports = {
Editor.Builder.removeListener('build-finished', doMakeUpdatePackage);
if (this.ftp) {
this.ftp.destroy();
- this.ftp = null;
+ this.ftp = null;
}
},
messages: {
diff --git a/packages/update-manager/package.json b/packages/update-manager/package.json
index 5e13ce5..88d56e3 100644
--- a/packages/update-manager/package.json
+++ b/packages/update-manager/package.json
@@ -9,6 +9,15 @@
"message": "update-manager:open"
}
},
+ "runtime-resource": {
+ "path": "./lib",
+ "name": "lib"
+ },
+ "reload": {
+ "ignore": [
+ "lib/**/*"
+ ]
+ },
"panel": {
"main": "panel/index.html",
"type": "simple",
diff --git a/packages/update-manager/panel/index.html b/packages/update-manager/panel/index.html
index 5f7aee3..be79522 100644
--- a/packages/update-manager/panel/index.html
+++ b/packages/update-manager/panel/index.html
@@ -28,21 +28,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+