CocosCreator | 熱更新詳細操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章