全面讲解cocoscreator热更新(2.4.x)

首先:我没这么操作过

我的建议是:
1,对比一下 下载下来的 文件是否是你上传的文件。如果没问题 ,就去查看一下构建后是否 加了 替换main.js里面 那段 设置 路径的代码块 (本文有提到)。
2,看一下你的构建和设置版本的顺序(这个概率比较小)

另外 如果您的 引擎版本是2.4及以上的 版本 可以用assetBundle去 实现热更新,这个方案 会更灵活方便一些 。如果对asset Bundle不了解 ,可以看一下官方文档或者我写的 一篇对assetbundle的 理解的 文章(写的比较详细)然后 根据自己项目需求 去 定制方案。祝你好运哈。

谢谢你的解答,应该是搜索路径不太对,2.2.2版本是src和res文件夹这样移动到game下是可以正常热更的,升级到2.4.4就不行了,因此我尝试在manifest文件的searchPaths添加game路径解决了问题

嗯嗯,恭喜恭喜

我先插个眼。。

关于动态地址热更这一条,还是有点问题。
已经将本地的manifest成功修改并写入了新的url,加载的也是本地的manifest,但是到更新的时候却没有用新的url去更新,而是使用了新url上远程服务器内的manifest里面的地址去更新。
目前是有方案需要修改AssetsManagerEx.cpp里面的代码来实现,不知道有没有别的好的方式呢

npm -v:8.1.0
cnpm -v :win32 x86 10.0.194041
express --version: 4.16.1
在xx.js,里面添加app.use(express.static(‘public’));
在文件夹public下放 hotUpdate目录
为什么要这么做,因为测试hotUpdate放在外面访问不了了,可能版本更新的问题,放在public下才能访问
http://localhost:8080/hotUpdate/project.manifest,
放入public,public不需要出现在域名

战略MARK

亮亮,请问下 getCurVesion()函数 ??? 这里,是不是有问题,storagePath不是一定被下面的值覆盖了吗?localStorage 是在热更结束后存的;没热更就走下面,取脚本传入的Manifest ,然后读版本号。。

/**获取缓存路径*/
    getRootPath() {
        return ((jsb.fileUtils ? jsb.fileUtils.getWritablePath() : '/') + this.remotePath);
    }

/**
     * 获取版本号
     * 如果已存有版本号则直接返回,如果没有则在本地manifest文件中取版本号;
     */
getCurVesion() {
        let curversion = cc.sys.localStorage.getItem(this.curVersion);
        cc.log("curversion", curversion);
        if (curversion) return curversion;

       ???
        let storagePath = this.getRootPath();
        storagePath = this.mainifestUrl.nativeUrl;
        if (storagePath) {
            let loadManifest = jsb.fileUtils.getStringFromFile(storagePath);
            let manifestObject = JSON.parse(loadManifest);
            curversion = manifestObject.version;
            console.log("当前版本号origin:", curversion)
        }
        return curversion;
    }

难道 jsb.fileUtils.getWritablePath 是异步的???

热更失败后,直接重新走流程更新可以么?
我们这边这么处理后,有部分单文件会丢失报错。

整包更新后,游戏内容依旧是热更内容,而不是最新包内容。是缓存问题导致的吗,是的话该如何处理呢

整包更新后重新进入游戏发现大版本变化了把搜索路径下的文件夹删了

在热更版本比较处删除对吗,本地版本大于远程版本,就触发以下删除代码

new jsb.AssetsManager(“”, _storagePath, versionCompareHandle);

versionCompareHandle 内部 => jsb.fileUtils.removeDirectory(jsb.fileUtils.getWritablePath());

应该新版本app下载完成热启动后在删除,你不能发现不一样就删万一新版本apk下载失败而你把缓存删了那不是gg了

好的我试试,感谢老铁

能顺利热更。但是会阻塞UI线程,导致不能更新UI比如进度条等。
我用的版本是2.4.11.
请问有遇到过么?

mark一下

mark一下

不会出错 ,缓存没了 至少是最原始的APK能用还 所以不会有问题,就算下次再启动 也用原始APK运行,然后还是继续下新的APK要 所以不会有问题