更多笔记:【微信公众号】 CocosCreator笔记
Step 1
首先请详细阅读官方文档:
http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html
是不是就感觉不用继续看了
下载文档中提到的version_generator.js文件,用于生成 Manfiest 文件的 NodeJS 脚本。将其放在项目根目录下~
Step 2
注意步骤的顺序:
1.构建,不要勾选 MD5 Cache
2.根据构建目录运行下面命令,生成manifest,自动放到asset下
jsb-default:
node version_generator.js -v 1.0.0 -u http://your-server-address/hot-update/remote-assets/ -s build/jsb-default/ -d assets/
jsb-link:
node version_generator.js -v 1.0.0 -u http://your-server-address/hot-update/remote-assets/ -s build/jsb-link/ -d assets/
下面是参数说明:
-v 指定 Manifest 文件的主版本号。
-u 指定服务器远程包的地址,这个地址需要和最初发布版本中 Manifest 文件的远程包地址一致,否则无法检测到更新。
-s 本地原生打包版本的目录相对路径。
-d 保存 Manifest 文件的地址。
3.(仅发布整包时需要)在编辑器中拖拽project.manifest到UpdateComponent脚本的manifestUrl
UpdateComponent脚本挂载到更新场景里~
下边是代码:
const {ccclass, property} = cc._decorator;
@ccclass
export default class UpdateComponent extends cc.Component {
@property({type: cc.Asset})
manifestUrl: cc.Asset = null;
@property
nameScene = "";
@property(cc.ProgressBar)
progressBar = null;
_storagePath = "";
_assetsManager = null;
start () {
this._storagePath = jsb.fileUtils.getWritablePath() + "asset/";
console.log(this._storagePath);
this._assetsManager = new jsb.AssetsManager(this.manifestUrl.nativeUrl, this._storagePath);
this._assetsManager.setMaxConcurrentTask(3);
this.checkAsset();
}
checkAsset()
{
this._assetsManager.setEventCallback(this.callCheck.bind(this));
this._assetsManager.checkUpdate();
}
updateAsset()
{
this._assetsManager.setEventCallback(this.callUpdate.bind(this));
this._assetsManager.update();
}
callCheck(event)
{
let update = false;
switch (event.getEventCode())
{
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
console.log('No local manifest file found, hot update skipped.');
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
console.log('Fail to download manifest file, hot update skipped.');
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
console.log('Already up to date with the latest remote version.');
break;
case jsb.EventAssetsManager.NEW_VERSION_FOUND:
console.log('New version found, please try to update.');
update = true;
break;
default:
return;
}
this._assetsManager.setEventCallback(null);
if (update) {
this.updateAsset();
} else {
cc.director.loadScene(this.nameScene);
}
}
callUpdate(event)
{
let finished = false;
let failed = false;
switch (event.getEventCode())
{
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
console.log('No local manifest file found, hot update skipped.');
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_PROGRESSION:
//event.getPercent();
//event.getPercentByFile();
//event.getDownloadedFiles() + ' / ' + event.getTotalFiles();
//event.getDownloadedBytes() + ' / ' + event.getTotalBytes();
this.progressBar.progress = event.getPercent();
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
console.log('Fail to download manifest file, hot update skipped.');
failed = true;
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
console.log('Already up to date with the latest remote version.');
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_FINISHED:
console.log('Update finished. ' + event.getMessage());
finished = true;
break;
case jsb.EventAssetsManager.UPDATE_FAILED:
console.log('Update failed. ' + event.getMessage());
break;
case jsb.EventAssetsManager.ERROR_UPDATING:
console.log('Asset update error: ' + event.getAssetId() + ', ' + event.getMessage());
break;
case jsb.EventAssetsManager.ERROR_DECOMPRESS:
console.log(event.getMessage());
break;
default:
break;
}
if (failed) {
this._assetsManager.setEventCallback(null);
}
if (finished) {
this._assetsManager.setEventCallback(null);
cc.audioEngine.stopAll();
cc.game.restart();
}
}
}
4.再次构建
5.(仅发布完整包时需要)打开main.js,在 require(xxx) 后 window.boot() 前加上下边的代码
if (cc.sys.isNative) {
let pathAsset = jsb.fileUtils.getWritablePath() + “asset/”
jsb.fileUtils.addSearchPath(pathAsset,true);
}
6.把生成的两个manifest文件复制到 build/jsb-default/ 或 build/jsb-link/ 目录下
7.把两个manifest文件和res文件夹和src文件夹放到服务器上