热更中manifest文件的url可否动态修改

知道一种方案是域名代替IP来处理,服务器挂了,启个新服就可以了,域名再跟新的IP重新绑定下。

现在的问题是,我想问有人做过动态代码修改manifest 里url的嘛?

就是热更地址由后台来配置,而不是前端打包来处理。这要求包内资源和本地缓存资源中的manifest,都能读写。

有人尝试过嘛?

支持,我做过,上线没有问题,但是需要先定制一下 AssetsManager.cpp 文件,然后在… 无法用语言描述

我是通过 AssetsManager.loadLocalManifest 函数实现的 动态修改热更地址

你可以先阅读一下引擎源码,看看有没有什么收获

嗯,好的~~
我的初步想法是,在原生端,读改写文件。

大神,你这方法更好更简单~~

其实不用改底层。。。在获得新的url 时候去更新cache目录的manifest 的url就搞定了。。

请指教,可否说详细些了~
cache 在热更脚本哪里获取到的了?

如果使用原生读写文件符合你的项目逻辑,那就不建议你定制引擎代码

我也是这样实现的,我希望是上层来控制地址和版本号,需要的时候再载入prefab

本想服务端manifest只留assets,但发现必须要有packageUrl和version,而我又不想同时有多个地方管理版本号,所以生成远程manifest的时候version永远是个超大的值。
然后客户端读文件,补上remoteManifestUrl,将version删除,最后loadLocalManifest

看上去理所当然,但是,第一次热更没问题,热更后再热更,就发现不了新版本了,必须在loadLocalManifest之前把修改过的内容写入本地,之后就一切顺利

没去读源码,不知道是不是对比版本时还是取的本地manifest的值,而不是取的读入的值,后面的同学请注意:grin:

贴一下 我在项目里面如何动态修改url 的吧
` public updateMainifestUrl(): void {
const projectPath: string = this._storagePath + “project.manifest”;
const versionPath: string = this._storagePath + “version.manifest”;
let projectManifest: any = null;
let versionManifest: any = null;
const fileUtils = jsb.fileUtils;
if (fileUtils.isDirectoryExist(projectPath)) {
projectManifest = JSON.parse(fileUtils.getStringFromFile(projectPath));
} else {
const data = this.projectManifest as any;
projectManifest = JSON.parse(data._nativeAsset);
}

    if (fileUtils.isDirectoryExist(versionPath)) {
        versionManifest = JSON.parse(fileUtils.getStringFromFile(versionPath));
    } else {
        const data = this.versionManifest as any;
        versionManifest = JSON.parse(data._nativeAsset);
    }

    projectManifest.packageUrl = Global.cdnurl + "/" + Global.newVersion + "/";
    projectManifest.remoteManifestUrl = `${Global.cdnurl}/${Global.newVersion}/project.manifest`;
    projectManifest.remoteVersionUrl = `${Global.cdnurl}/${Global.newVersion}/version.manifest`;
    IOMgr.writeFileByString(projectPath, JSON.stringify(projectManifest));
    versionManifest.packageUrl = Global.cdnurl + "/" + Global.newVersion + "/";
    versionManifest.remoteManifestUrl = `${Global.cdnurl}/${Global.newVersion}/project.manifest`;
    versionManifest.remoteVersionUrl = `${Global.cdnurl}/${Global.newVersion}/version.manifest`;
    if (versionManifest) {
        IOMgr.writeFileByString(versionPath, JSON.stringify(versionManifest));
    }

`

流程大概就是 如果cache目录没有manifest文件 就生成一份 把里面的url 换成你需要修改的url 保存 这样下次检查就是你已经修改了的url

https://blog.csdn.net/xufeng0991/article/details/102961887

这个分包方案,用的就是用的动态修改url