使用自己的manifest比较版本时 相同版本时会把热更新目录清空

  • Creator 版本:1.9.1

  • 目标平台: iOS / Android / 模拟器

  • 详细报错信息,包含调用堆栈:

  • 重现方式:热更新版本比较

由于我需要动态变更热更新服务器的地址,所以每次检查热更新的时候,都会自己生成一个manifest文件,变更里面的远程地址,检查更新时,就使用这个我生成的manifest文件

this._am.loadLocalManifest(this._storagePath + “/newProject.manifest”);

现在出现的情况是,首次热更新正常,会从服务器下载文件并保存下来,但是当我再次打开app的时候,程序会自己把握热更新的目录给删除掉,具体的情况看这个帖子
http://forum.cocos.com/t/topic/62429

后来发现,
热更新的源码中 AssetManagerEx 中 loadLocalManifest函数,如果本地的热更新文件夹中,存在一个project.manifest 的文件的话,代码会在比较project.manifest 和 我自己加载的 manifest 文件,当自己文件的版本>=project.manifest 文件的话,程序就会清空原来的热更新目录。

可能开发人员是为了保证大版本更新的时候,程序会清空原本的热更新目录,源码中对新版本的判断用的是 大于等于>= 造成了我自己的manifest的版本 与 project.manifest 版本一致的时候,也会清空目录


这里用的是 >= 0 判断

版本一致 就会清空目录

我现在的处理办法是每次成功热更新之后,就手动删除掉本地的 project.manifest,但是这样的话,如果有大版本的更新,就可能需要另外写代码处理热更新目录了。

发现论坛中有几个朋友也遇到这样的问题
http://forum.cocos.com/t/topic/60336
http://forum.cocos.com/t/topic/57720

对于大版本更新,后来自己写了一个函数,现在判断本地原始版本是否和远程服务器一致或者更加新,如果版本一致或者更加新,就会清空原热更新文件夹

private CompareAppOriginVersionAndHotUpdateVersion()
    {
        let appOriginVersionStr = jsb.fileUtils.getStringFromFile(this.originManifestUrl);
        var appOriginVersion=JSON.parse(appOriginVersionStr);
        var hotUpdateVersion;
        if (!jsb.fileUtils.isFileExist(this._storagePath + "/hotUpdatedProject.manifest")) 
        {
            return;
        }
        else
        {
            let filestring = jsb.fileUtils.getStringFromFile(this._storagePath + "/hotUpdatedProject.manifest");
            hotUpdateVersion=JSON.parse(filestring);
        }
        var result=this.VersionCompareHandle(appOriginVersion.version,hotUpdateVersion.version);

        //如果app的版本 >= 热更新目录中的版本
        if (result>=0) 
        {
            //就清除热更新目录
            jsb.fileUtils.removeDirectory(this._storagePath);
            jsb.fileUtils.createDirectory(this._storagePath);
        }
        
    }
1赞

自己的manifest指的是自己热更新下来的项目里的asset里的manifest吗?

澄清一下比较的逻辑:localManifest 是 app 包内的版本,cachedManifest 是本地缓存的版本,所以当 app 包内版本大于本地缓存的版本时,就需要清理本地缓存了,否则缓存会影响到 app 包内版本的正确性

可以不可以 每次更新都new jsb.Manifest()一个localManifest?可不可以每次都把localManifest的version设为0.0.1,因为暂时没想用清缓存,而且我发现localManifest的版本和缓存里的版本相同是也会清缓存

请教一下,安装新的apk的时候,如何清理掉热更新的缓存呢?

你的APK包里有个版本号吧 你的缓存目录里也有个版本号吧 比较一下,如果APK本身的版本高于缓存的版本 那就要删除缓存了

是的,我现在是需要知道如何去删除掉缓存,应该删除哪些缓存,可能我没有这方面的经验,能请教一下大佬吗

看官方例程 找到这个对应你自己项目里的路径 然后 jsb.fileUtils.removeDirectory