cocos creator热更新-菜鸟教程

!写在前面 最后有源码

说下几个重要的环节:首先是version_generator.js文件 可以在官方案例下载  

热更新管理器 · GitBook

这几个属性可以直接写在version文件里


需要下载nodeJs  用来生成   manifest  文件


第一次构建以后需要在mani.js里加上搜索路劲  main.js文件在build\jsb-default下


if (jsb) { var hotUpdateSearchPaths = localStorage.getItem('HotUpdateSearchPaths'); if (hotUpdateSearchPaths) { jsb.fileUtils.setSearchPaths(JSON.parse(hotUpdateSearchPaths)); }}   然后就可以编译了

                    第一个apk包基本就这些东西 然后更新包把版本号提升一下

在随便改点东西重新构建一下     

    然后用nodejs重新生成 manifest文件   然后把构建后的 project.manifest   version.manifest    src  res 4个文件放在服务器的remote-assets文件下面  


注意服务器网站的文件类型后缀识别(.json,.manifest,jsc)  不然可能更新下载失败

        如果没有检测到更新那肯定是 manifest文件的问题  


第一次如果没有manifest文件 就先构建好了 用nodejs生成manifest文件放在属性里

直接贴代码  有问题可以留言
cc.Class({

    extends: cc.Component,

    properties: {

        manifestUrl: {

            default: null,

            type: cc.Asset

        },

        versionLabel: cc.Label,


        btn_check: cc.Button,

        btn_update: cc.Button,

        tipLabel: cc.Label,

        byteProgress: cc.ProgressBar,

        byteLabel: cc.Label,

        fileProgress: cc.ProgressBar,

        fileLabel: cc.Label,

    },


    start() {

        this.updating = false

        this.canRetry = false

        this.btn_update.node.active = false

        this.byteProgress.node.active = false

        this.fileProgress.node.active = false

        this.tipLabel.node.active = false

        if (!cc.sys.isNative) return

        //获取存储路径

        this.storagePath = ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + 'remote-asset')

        //版本比较函数

        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 (let 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

            }

        }

        //创建资源管理对象

        this.am = new jsb.AssetsManager('', this.storagePath, this.versionCompareHandle)

        this.am.setVerifyCallback(function (path, asset) {

            console.log('设置回调验证' + asset)

            var compressed = asset.compressed;

            var expectedMD5 = asset.md5;

            var relativePath = asset.path;

            var size = asset.size;

            if (compressed) {

                this.tipLabel.string = "Verification passed : " + relativePath;

                return true;

            }

            else {

                this.tipLabel.string = "Verification passed : " + relativePath + ' (' + expectedMD5 + ')';

                return true;

            }

        }.bind(this));

        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);

            console.log('安卓开启双线程更新模式')

        }

        var url = this.manifestUrl.nativeUrl;

        if (cc.loader.md5Pipe) {

            url = cc.loader.md5Pipe.transformURL(url);

        }

        this.am.loadLocalManifest(url);

        var version = this.am.getLocalManifest().getVersion();

        console.log('version=' + version)

        this.versionLabel.string = version

        this.fileProgress.progress = 0;

        this.byteProgress.progress = 0;



        //检查更新

        this.checkUpdate()

    },

    checkUpdate() {

        this.tipLabel.string = '检查更新';

        var state = this.am.getState()

        //if (state=== jsb.AssetsManager.State.UNINITED) {

        // Resolve md5 url

        console.log('检查更新')

        this.am.setEventCallback(this.checkCb.bind(this));

        this.failCount = 0;

        this.am.checkUpdate();

        this.updating = true;

        // }

    },


    checkCb(event) {

        console.log('Code: ' + event.getEventCode());

        switch (event.getEventCode()) {

            case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:

                this.tipLabel.string = '本地文件丢失'

                break;

            case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:

            case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:

                this.tipLabel.string = "下载远程mainfest文件错误.";

                break;

            case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:

                this.tipLabel.string = "已经是最新版本.";

                break;

            case jsb.EventAssetsManager.NEW_VERSION_FOUND:    //显示更新按钮 调用hotUpdate方法

                this.tipLabel.node.active = true

                this.tipLabel.string = '有新版本发现,请点击更新.';

                this.btn_update.node.active = true

                this.btn_check.interactable = false;


                break;

            default:

                return;

        }

        this.am.setEventCallback(null);

        this.updating = false;

    },


    hotUpdate: function () {

        if (this.am && !this.updating) {

            console.log('更新')

            this.am.setEventCallback(this.updateCb.bind(this));

            if (this.am.getState() === jsb.AssetsManager.State.UNINITED) {

                // Resolve md5 url

                var url = this.manifestUrl.nativeUrl;

                if (cc.loader.md5Pipe) {

                    url = cc.loader.md5Pipe.transformURL(url);

                }

                this.am.loadLocalManifest(url);

                console.log('本地地址' + url)

            }

            this.failCount = 0;

            this.am.update();

            this.updating = true;

        }

    },

    updateCb(event) {

        console.log('Code: ' + event.getEventCode());

        var needRestart = false;

        var failed = false;

        this.byteProgress.node.active = true

        this.fileProgress.node.active = true

        switch (event.getEventCode()) {

            case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:

                this.tipLabel.string = '本地版本文件丢失,无法更新.';

                failed = true;

                break;

            case jsb.EventAssetsManager.UPDATE_PROGRESSION:

                this.byteProgress.progress = event.getPercent();

                this.fileProgress.progress = event.getPercentByFile();

                this.fileLabel.string = event.getDownloadedFiles() + ' / ' + event.getTotalFiles();

                this.byteLabel.string = event.getDownloadedBytes() + ' / ' + event.getTotalBytes();

                var msg = event.getMessage();

                if (msg) {

                    this.tipLabel.string = 'Updated file: ' + msg;

                    console.log(event.getPercent() / 100 + '% : ' + msg);

                }

                break;

            case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:

            case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:

                this.tipLabel.string = '下载远程版本文件失败.';

                failed = true;

                break;

            case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:

                this.tipLabel.string = '当前为最新版本.';

                failed = true;

                break;

            case jsb.EventAssetsManager.UPDATE_FINISHED:

                this.tipLabel.string = '更新完成. ' + event.getMessage();

                needRestart = true;

                break;

            case jsb.EventAssetsManager.UPDATE_FAILED:

                this.proc.string = '更新失败. ' + event.getMessage();

                this.btn_rectry.interactable = true;

                this.updating = false;

                this.canRetry = true;

                this.btn_update.interactable = false

                break;

            case jsb.EventAssetsManager.ERROR_UPDATING:

                this.tipLabel.string = '资源更新错误: ' + event.getAssetId() + ', ' + event.getMessage();

                this.btn_update.interactable = false

                break;

            case jsb.EventAssetsManager.ERROR_DECOMPRESS:

                this.tipLabel.string = event.getMessage();

                break;

            default:

                break;

        }

        if (failed) {

            this.am.setEventCallback(null);

            this.updating = false;

        }

        //下载完成

        if (needRestart) {

            this.am.setEventCallback(null);

            console.log('热更完成')

            // 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);

            cc.sys.localStorage.setItem('HotUpdateSearchPaths', JSON.stringify(searchPaths));

            jsb.fileUtils.setSearchPaths(searchPaths);

            cc.audioEngine.stopAll();

            cc.game.restart();

        }

    },


    retry: function () {

        if (!this.updating && this.canRetry) {

            this.panel.retryBtn.active = false;

            this.canRetry = false;

            this.tipLabel.string = 'Retry failed Assets...';

            this.am.downloadFailedAssets();

        }

    },

});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353