请问微信小游戏加载自定义二进制文件的问题

之前加载二进制文件使用了 cc.loader.addDownloadHandlers 注册自定义的加载方法:

//注册dat文件下载处理器
var arrayBufferHandler = function (item, callback) {
var url = item.url;
var xhr = cc.loader.getXMLHttpRequest(),
errInfo = ‘Load ’ + url + ’ failed!’;
xhr.open(“GET”, url, true);
xhr.responseType = “arraybuffer”;
xhr.onload = function (oEvent) {
var arrayBuffer = xhr.response;
if (arrayBuffer) {
callback(null, arrayBuffer);
}
else {
callback(errInfo); // 第一个参数需要传递错误信息
}
};
xhr.send(null);
};
cc.loader.addDownloadHandlers({
‘dat’: arrayBufferHandler
});

但是在微信开发者工具中,我使用pako库解压下载的二进制压缩文件,pako内部报错了,说明下载的内容不对,有可能是微信环境不支持 cc.loader.getXMLHttpRequest(), 方法吗?谢谢 ! @jare @panda

我查了一下,好像微信小游戏环境是和之前web mobile有区别。
web mobile里是一个http request下载的,在小游戏里面引擎使用了一个web socket去下载。不知道是否是web socket下载完成之后将内容保存成了文本,有点像啊

找到了,二进制文件被包装到一个文本协议里面返回了,就变成了乱码的文本。@Jare @panda 有么有workaround啊各位大哥

补充:我试图找这个web socket是在哪儿,然而在引擎的代码和wx-downloader.js里面都没有找到,猜想是wx sdk里面实现的,可能是fs.access和fs.readFile内部实现的,应该不是downloadRemoteFile调用的,因为没走到那儿。

自己回复一下。目前找到一个workaround,还是用上面的addDownloadHandlers方案。不过需要改动两处:
1)在wx-downloader.js里面,non_text_format里面添加你自己的自定义二进制文件的格式,也就是addDownloadHandlers注册的格式,我这儿是’dat’
为了避免导出时覆盖,可以在编辑器app模板里面修改

2)上面代码 var url = item.url; 这句,改为:
var url = wxDownloader.REMOTE_SERVER_ROOT + item.url;

然后只要设置 REMOTE_SERVER_ROOT 就可以了。

平时开发的时候,也不一定把导出的res拷贝到某个服务器上,可以直接用编辑器在7456端口架设的http服务,因为7456那个是不带md5的,所以导出时不勾选md5cache就可以。当然如果正规版本测试,建议还是放到独立的服务器上。如果是用7456这个http,可以设置为:wxDownloader.REMOTE_SERVER_ROOT = “http://127.0.0.1:7456/”;

另外谁能告诉我除了在模板里面设置 REMOTE_SERVER_ROOT 之外,还可以在哪儿设置,导出的时候不被覆盖掉。谢谢!

补充:
1)item.url会被加上http前缀,使用item.id。但是这就属于自己拼URL了,微信文档里面并不推荐,暂时也没什么办法。
2)这种方式实际上是通过wx.Request接口去进行网络请求,在response里面获取到的就是arraybuffer。(为啥?请参考小游戏文档adapter)。据我观察,这种方式完美的避过了cocos官方在wx-downloader.js里面实现的缓存机制。也就是说每次请求都会去下载,没有缓存。。。当然,我在微信开发工具里面看到,重复请求是“from disk cache”,并不是真的请求了,但是真机是否如此我就不知道了。即便有disk cache,这个cache的存活时间也是不知道的,可能我文档看得还不够多吧。
当然解决办法还是有的,比如说使用wx的api自己实现一个缓存。当然如果cocos官方能更新二进制文件的支持就最好了。

3赞

顶顶顶顶顶

感谢前人踩坑。可以写个扩展package,在build完成之后修改wx-Downloader.js文件,就不用改引擎源码了

这个坑还没修好吗?遇到同样问题

自定义加载有问题的,可以参考这个PR,其他问题请提供测试代码。
https://github.com/cocos-creator/engine/pull/3935