【需求】:我想在微信小程序启动的时候,判断某个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赞