以下hotupdate代码
var UpdatePanel = require(‘UpdatePanel’);
cc.Class({
extends: cc.Component,
properties: {
panel: UpdatePanel,
manifestUrl: cc.RawAsset,
updateUI: cc.Node,
_updating: false,
_canRetry: false,
_storagePath: ''
},
show: function () {
if (this.updateUI.active === false) {
this.updateUI.active = true;
}
},
hide: function(){
if (this.updateUI.active === true) {
this.updateUI.active = false;
}
},
// use this for initialization
onLoad: function () {
// Hot update is only available in Native build
console.log("进了热更了");
if (!cc.sys.isNative) {
this.hide();
return;
}
this.show();
this._storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/'));
cc.log('Storage path for remote asset : ' + this._storagePath);
// Setup your own version compare handler, versionA and B is versions in string
// if the return value greater than 0, versionA is greater than B,
// if the return value equals 0, versionA equals to B,
// if the return value smaller than 0, versionA is smaller than B.
this.versionCompareHandle = function (versionA, versionB) {
cc.log("JS Custom Version Compare: version A is " + versionA + ', version B is ' + versionB);
var vA = versionA.split('.');
var vB = versionB.split('.');
for (var i = 0; i < vA.length; ++i) {
var a = parseInt(vA[i]);
var b = parseInt(vB[i] || 0);
if (a === b) {
continue;
}
else {
return a - b;
}
}
if (vB.length > vA.length) {
return -1;
}
else {
return 0;
}
};
// Init with empty manifest url for testing custom manifest
let url = this.manifestUrl;
// if (cc.loader.md5Pipe) {
// url = cc.loader.md5Pipe.transformURL(url);
// }
var testPath = "res/project.manifest";
this._am = new jsb.AssetsManager(url, this._storagePath, this.versionCompareHandle);
// this._am = new jsb.AssetsManager('', this._storagePath, this.versionCompareHandle);
var panel = this.panel;
// Setup the verification callback, but we don't have md5 check function yet, so only print some message
// Return true if the verification passed, otherwise return false
this._am.setVerifyCallback(function (path, asset) {
// When asset is compressed, we don't need to check its md5, because zip file have been deleted.
var compressed = asset.compressed;
// Retrieve the correct md5 value.
var expectedMD5 = asset.md5;
// asset.path is relative path and path is absolute.
var relativePath = asset.path;
// The size of asset file, but this value could be absent.
var size = asset.size;
if (compressed) {
panel.info.string = "Verification passed : " + relativePath;
return true;
}
else {
panel.info.string = "Verification passed : " + relativePath + ' (' + expectedMD5 + ')';
return true;
}
});
this.panel.info.string = '正在进行更新检测...';
if (cc.sys.os === cc.sys.OS_ANDROID) {
// Some Android device may slow down the download process when concurrent tasks is too much.
// The value may not be accurate, please do more test and find what's most suitable for your game.
this._am.setMaxConcurrentTask(2);
// this.panel.info.string = "Max concurrent tasks count have been limited to 2";
}
this.panel.fileProgress.progress = 0;
this.panel.byteProgress.progress = 0;
this.checkUpdate();
},
checkUpdate: function () {
if (this._updating) {
// this.panel.info.string = 'Checking or updating ...';
console.log("Checking or updating ...");
return;
}
if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {
// Resolve md5 url
var url = this.manifestUrl;
// if (cc.loader.md5Pipe) {
// url = cc.loader.md5Pipe.transformURL(url);
// }
// console.log("check update url ",url);
this._am.loadLocalManifest(url);
}
if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) {
this.panel.info.string = '加载热更文件失败,请重新下载游戏 ...';
return;
}
// this._am.setEventCallback(this.checkCb.bind(this));
this._updateListener = new jsb.EventListenerAssetsManager(this._am, this.checkCb.bind(this));
cc.eventManager.addListener(this._updateListener, 1);
this._am.checkUpdate();
this._updating = true;
},
checkCb: function (event) {
cc.log('Code: ' + event.getEventCode());
this.needUpdate = false;
this.isNew = false;
switch (event.getEventCode())
{
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
this.panel.info.string = "本地升级文件未找到";
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
this.panel.info.string = "获取更新信息失败";
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
this.panel.info.string = "已经是最新版本了.";
this.isNew = true;
break;
case jsb.EventAssetsManager.NEW_VERSION_FOUND:
this.panel.info.string = '发现新版本,即将准备更新,请勿关闭...';
this.panel.checkBtn.active = false;
this.panel.fileProgress.progress = 0;
this.panel.byteProgress.progress = 0;
this.needUpdate = true;
break;
default:
this.panel.info.string = '更新中...';
return;
}
// this._am.setEventCallback(null);
this._updateListener = new jsb.EventListenerAssetsManager(this._am,null);
cc.eventManager.addListener(this._updateListener, 1);
this._checkListener = null;
this._updating = false;
if(this.needUpdate == true){ //检测到了 调用热更1
this.hotUpdate();
}
else if(this.isNew == true){
this.hide();
}
},
hotUpdate: function () {
if (this._am && !this._updating) {
// this._am.setEventCallback(this.updateCb.bind(this));
this._updateListener = new jsb.EventListenerAssetsManager(this._am, this.updateCb.bind(this));
cc.eventManager.addListener(this._updateListener, 1);
if (this._am.getState() === jsb.AssetsManager.State.UNINITED) {
// Resolve md5 url
var url = this.manifestUrl;
// if (cc.loader.md5Pipe) {
// url = cc.loader.md5Pipe.transformURL(url);
// }
this._am.loadLocalManifest(url);
}
this._failCount = 0;
this._am.update();
this.panel.updateBtn.active = false;
this._updating = true;
}
},
updateCb: function (event) {
var needRestart = false;
var failed = false;
switch (event.getEventCode())
{
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
this.panel.info.string = 'No local manifest file found, hot update skipped.';
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_PROGRESSION:
this.panel.byteProgress.progress = event.getPercent();
this.panel.fileProgress.progress = event.getPercentByFile();
this.panel.fileLabel.string = event.getDownloadedFiles() + ' / ' + event.getTotalFiles();
this.panel.byteLabel.string = event.getDownloadedBytes() + ' / ' + event.getTotalBytes();
var msg = event.getMessage();
if (msg) {
this.panel.info.string = '正在更新: ' + msg;
// cc.log(event.getPercent()/100 + '% : ' + msg);
}
break;
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
this.panel.info.string = 'Fail to download manifest file, hot update skipped.';
failed = true;
break;
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
this.panel.info.string = 'Already up to date with the latest remote version.';
failed = true;
break;
case jsb.EventAssetsManager.UPDATE_FINISHED:
this.panel.info.string = 'Update finished. ' + event.getMessage();
needRestart = true;
break;
case jsb.EventAssetsManager.UPDATE_FAILED:
this.panel.info.string = 'Update failed. ' + event.getMessage();
// this.panel.retryBtn.active = true;
this._updating = false;
this._canRetry = true;
break;
case jsb.EventAssetsManager.ERROR_UPDATING:
this.panel.info.string = 'Asset update error: ' + event.getAssetId() + ', ' + event.getMessage();
break;
case jsb.EventAssetsManager.ERROR_DECOMPRESS:
this.panel.info.string = event.getMessage();
break;
default:
break;
}
if (failed) {
// this._am.setEventCallback(null);
this._updateListener = new jsb.EventListenerAssetsManager(this._am,null);
cc.eventManager.addListener(this._updateListener, 1);
this._updateListener = null;
this._updating = false;
}
if (needRestart) {
// this._am.setEventCallback(null);
this._updateListener = new jsb.EventListenerAssetsManager(this._am,null);
cc.eventManager.addListener(this._updateListener, 1);
this._updateListener = null;
// Prepend the manifest's search path
var searchPaths = jsb.fileUtils.getSearchPaths();
var newPaths = this._am.getLocalManifest().getSearchPaths();
console.log(JSON.stringify(newPaths));
Array.prototype.unshift.apply(searchPaths, newPaths);
// This value will be retrieved and appended to the default search path during game startup,
// please refer to samples/js-tests/main.js for detailed usage.
// !!! Re-add the search paths in main.js is very important, otherwise, new scripts won't take effect.
cc.sys.localStorage.setItem('HotUpdateSearchPaths', JSON.stringify(searchPaths));
jsb.fileUtils.setSearchPaths(searchPaths);
cc.audioEngine.stopAll();
cc.game.restart();
}
},
onDestroy: function () {
if (this._updateListener) {
// this._am.setEventCallback(null);
this._updateListener = new jsb.EventListenerAssetsManager(this._am,null);
cc.eventManager.addListener(this._updateListener, 1);
this._updateListener = null;
}
}
});