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文件夹放到服务器上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值