关于官方提供的热更新示例无效

之前做热更的时候发现的,直接跑官方的示例有问题

查了一下报错日志,是 JS 操作不当导致 C++ 报错,改之

仅提供一个修改参考方案,具体需要等官方查证修改

    // HotUpdate.js
    // ..
    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 = 'Updated file: ' + 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 = null;
            this._updating = false;
        }

        if (needRestart) {
            this._am.setEventCallback(null);
            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);
            searchPaths.unshift(newPaths[0]);
            // >>>>>修改结束

            // 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();
        }
    },

@jare @huanxinyin

问题出现在。
this._am.setEventCallback(null); 这句吧

this._am.setEventCallback(this.checkCb.bind(this)); 和 this._am.setEventCallback(this.updateCb.bind(this));这两句就会卡住,怎么解决啊

感觉是this._am.setEventCallback这个函数在1.10.2版本中不存在?请引擎大大回复一下

2.0.9会卡到updateCb上,不知道为什么

1赞

请问你的解决了吗,我也是卡在这个方法里了

1赞

这里只是设置回调函数,怎么会卡住呢?打印下checkCb和updateCb的调用参数,看看是不是跑了,最后的状态值是什么。

1赞

官方的demo就是卡住的,可以看下官方的2.x的demo。最后是通过注视掉checkCb中的 this._am.setEventCallback(null);解决的

1赞

麻烦帮忙给下官方2.x demo链接,谢谢

1赞

我的cocos creator是2.0.8,就是注释了上面说的这句话,就不会卡在更新的时候了,我用的demo就是官方的热更新demo,如果不注释这句话,会一直进不去updateCb中

E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]checkUpdate@src/project.js:607
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking function (12241008) failed!
jsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]hotUpdate@src/project.js:615
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking function (121B60A0) failed!
jsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
D/jswrapper (560): XMLHttpRequest_finalize, 11D43318 …
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]checkUpdate@src/project.js:607
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking functionjsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!
(121B6180) failed!
E/jswrapper (268): ERROR: Uncaught TypeError: this._am.setEventCallback is not a function, location: src/project.js:0:0
STACK:
[0]hotUpdate@src/project.js:615
[1]emit@src/jsb_polyfill.js:4643
[2]emitEvents@src/jsb_polyfill.js:4631
[3]_onTouchEnded@src/jsb_polyfill.js:4261
[4]78.r.invoke@src/jsb_polyfill.js:9320
[5]anonymous@src/jsb_polyfill.js:9454
[6]79.l.dispatchEvent@src/jsb_polyfill.js:9469
[7]C@src/jsb_polyfill.js:1267
E/jswrapper (520): [ERROR] (e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\jswrapper\v8\object.cpp, 520): Invoking function (121B60A0) failed!
jsb: ERROR: File e:\project\courseyear\build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual\jsb_cocos2dx_manual.cpp: Line: 487, Function: invokeJSTouchOneByOneCallback
invokeJSTouchOneByOneCallback call function failed!

1.9.3也报错,this._am.setEventCallback(this.checkCb.bind(this))这里错误,assetManger没有setEventCallback方法,请问官方人员这个setEventCallback到底哪个版本有??

请问下有官方人员出来回复下吗?

:slightly_smiling:回复啥,上边代码都贴出来了

是要注释this._am.setEventCallback(this.checkCb.bind(this))这句吗??

看我的

官网的示例 下次给例子麻烦贴一下 cocoscreator版本号 sdk ndk版本号 最好自己在试试 官方例子现在也无法运行

无法运行,是报什么错误了吗?目前 creator 3.x 版本都支持,sdk 和 ndk 可以参考文档
https://docs.cocos.com/creator/3.1/manual/zh/editor/publish/setup-native-development.html#下载发布-android-平台所需的-sdk-和-ndk