更多筆記和源碼請關注:【微信公衆號】 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文件夾放到服務器上