微信小游戏如何判断Bundle已经下载过了?

【需求】:我想在微信小程序启动的时候,判断某个Bundle(MD5 cache)远程包是否已经下载过了。
【目前情况】:看官方问题推荐使用cc.assetManager.cacheManager.getCache,来查询是否已经被文件系统缓存了,但是我现在使用 cc.assetManager.cacheManager.getCache(bundle.base) ,微信平台返回是空。
【猜想】:bundle.base得到的是一个文件夹的URL, cc.assetManager.cacheManager.getCache无法以文件夹名判断,那么我就需要自己遍历bundle下面的每一个文件是否被下载过,那么我如何拿到Bundle远程包下每个文件的真实url呢?或者我可以通过 bundle.base + config + 【md5 cache值】+.json 来判断,但是这个【md5 cache值】我用什么API获得?
【期望】:是不是有更好的方法,直接判断Bundle是否已经下载了呢?

1赞

每间隔一小时自己顶一下。

每间隔一小时自己顶一下

我的bundle用的是zip的形式;你这样子试试看;
const cacheUrl = fullUrl + ‘/config.json’;
const cacheJson = assetManager.cacheManager?.getCache(cacheUrl);
const zipurl = fullUrl + ‘/res.zip’;
const cachezip = assetManager.cacheManager?.getCache(zipurl);
//走缓存逻辑;
if (cacheJson && cachezip) {
//…
}

嗯 这个方式应该可行,zip包减少io是个不错的方式。十分感谢。

各位大佬,还有没有其他方案?请多多指教

大佬,我想问一下,你们版本更新时怎么判断的?

  构建是写了一个自动构建插件,每次构建bundle的名字都会+1,比如:testBundle_1;

然后获取所有的缓存cache文件,再去遍历有没有当前这个名字的文件;
const cacheFiles = assetManager.cacheManager?.cachedFiles as any;
if (cacheFiles && cacheFiles._map) {
const keyList = [];
const keys = Object.keys(cacheFiles._map);
for (let i = 0, len = keys.length; i < len; i++) {
const cacheFileName = keys[i];
if (cacheFileName.match(fullUrl)) {
keyList.push(cacheFileName);
}
}

            let cacheJson: any = null;
            let cachezip: any = null;
            if (keyList.length === 2) {
                for (let i = 0, len = keyList.length; i < len; i++) {
                    if (keyList[i].match('json')) {
                        const cacheUrl = keyList[i];
                        cacheJson = assetManager.cacheManager?.getCache(cacheUrl);
                    } else if (keyList[i].match('zip')) {
                        const zipurl = keyList[i];
                        cachezip = assetManager.cacheManager?.getCache(zipurl);
                    }
                }
            }

            if (cacheJson && cachezip) {
                getBundle(cacheJson, cachezip);
            }
1赞