1、Cocos2dx热更新因为文件名含有空格,ios下载失败bug修改

问题描述:

  项目中偶尔遇到美术图片命名时不规范,导致图片名字含有空格。导致ios热更新时,遇到下载失败。

解决方案:

1.从新改名字(以后命名一定要规范)

2.空格转义 解决下载失败问题

url

web 开发中通过问号(?)方式在浏览器地址栏中传值时。浏览器是通过“&”来区分问号后的参数个数的。 如果出现传值参数中带有“&”时,在接受页面就会出现错误,类似如下请求路径:/next.jsp?param1=hendhs89&furej & param2=sss
参数param1中含有转义字符“&” ,这样会导致被请求页的参数接收错误。
在传值前 通过 java.net.URLEncoder.encode(param1) 编码处理后,可将转义字符转为16进制;
1. + URL 中+号表示空格 %2B
2. 空格 URL中的空格可以用+号或者编码 %20
3. / 分隔目录和子目录 %2F
4. ? 分隔实际的 URL 和参数 %3F
5. % 指定特殊字符 %25
6. # 表示书签 %23
7. & URL中指定的参数间的分隔符%26
8. = URL中指定参数的值 %3D
9. ! URL中指定参数的值 %2
 

具体解决方案

1、AssetsManagerEx::startUpdate()中,拼接地址时,将空格转义

void AssetsManagerEx::startUpdate()
{
if (_updateState != State::NEED_UPDATE)
return; _updateState = State::UPDATING;
// Clean up before update
_failedUnits.clear();
_downloadUnits.clear();
_compressedFiles.clear();
_totalWaitToDownload = _totalToDownload = ;
_percent = _percentByFile = _sizeCollected = _totalSize = ;
_downloadedSize.clear();
_totalEnabled = false; // Temporary manifest exists, resuming previous download
if (_tempManifest->isLoaded() && _tempManifest->versionEquals(_remoteManifest))
{
_tempManifest->genResumeAssetsList(&_downloadUnits);
_totalWaitToDownload = _totalToDownload = (int)_downloadUnits.size();
this->batchDownload(); std::string msg = StringUtils::format("Resuming from previous unfinished update, %d files remains to be finished.", _totalToDownload);
dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_PROGRESSION, "", msg);
}
// Check difference
else
{
// Temporary manifest not exists or out of date,
// it will be used to register the download states of each asset,
// in this case, it equals remote manifest.
_tempManifest->release();
_tempManifest = _remoteManifest; std::unordered_map<std::string, Manifest::AssetDiff> diff_map = _localManifest->genDiff(_remoteManifest);
if (diff_map.size() == )
{
updateSucceed();
}
else
{
// Generate download units for all assets that need to be updated or added
std::string packageUrl = _remoteManifest->getPackageUrl();
for (auto it = diff_map.begin(); it != diff_map.end(); ++it)
{
Manifest::AssetDiff diff = it->second; if (diff.type == Manifest::DiffType::DELETED)
{
_fileUtils->removeFile(_storagePath + diff.asset.path);
}
else
{
std::string path = diff.asset.path;
// Create path
_fileUtils->createDirectory(basename(_storagePath + path)); DownloadUnit unit;
unit.customId = it->first; std::string str(path),s2(" "),s3("%20");
std::string::size_type pos=0;
std::string::size_type a=s2.size();
std::string::size_type b=s3.size();
while((pos=str.find(s2,pos))!=std::string::npos)
{
str.replace(pos,a,s3);
pos+=b;
}
unit.srcUrl = packageUrl + str;
unit.storagePath = _storagePath + path;
_downloadUnits.emplace(unit.customId, unit);
}
}
// Set other assets' downloadState to SUCCESSED
auto &assets = _remoteManifest->getAssets();
for (auto it = assets.cbegin(); it != assets.cend(); ++it)
{
const std::string &key = it->first;
auto diffIt = diff_map.find(key);
if (diffIt == diff_map.end())
{
_tempManifest->setAssetDownloadState(key, Manifest::DownloadState::SUCCESSED);
}
}
_totalWaitToDownload = _totalToDownload = (int)_downloadUnits.size();
this->batchDownload(); std::string msg = StringUtils::format("Start to update %d files from remote package.", _totalToDownload);
dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_PROGRESSION, "", msg);
}
}
}

2、Manifest.cpp

void Manifest::genResumeAssetsList(DownloadUnits *units) const
{
for (auto it = _assets.begin(); it != _assets.end(); ++it)
{
Asset asset = it->second; if (asset.downloadState != DownloadState::SUCCESSED)
{
DownloadUnit unit;
unit.customId = it->first;
std::string str(asset.path),s2(" "),s3("%20");
std::string::size_type pos=0;
std::string::size_type a=s2.size();
std::string::size_type b=s3.size();
while((pos=str.find(s2,pos))!=std::string::npos)
{
str.replace(pos,a,s3);
pos+=b;
}
unit.srcUrl = _packageUrl + str;
unit.storagePath = _manifestRoot + asset.path;
units->emplace(unit.customId, unit);
}
}
}

2、Cocos2dx热更新因为文件名含有空格,ios下载失败bug修改

问题描述:

AsstsManagerEx: project.manifest may be downloaded twice。

project.manifest下载两次 ,导致热更新失败。打印log提示 解析project.manifest失败。

解决方案:

Cocos 3.14版本 自己解决了这个问题,根据就该日志 更新下载器。

3、更新过程强制退出,导致不能缓存下载。下载失败之后,不对比MD5所有文件都下载bug。

新版本不知道有没有。这个对应版本是 3.11

解决思路 。

下载器一开始先判断有没有缓存文件,有缓存文件的话,直接读取缓存文件。由于上一次强退没有及时将下载进度写到缓存文件中

所以所有文件的状态都是1.这里由于是临时清单文件,没有做MD5对比。所有所有文件都被添加到下载清单,出现bug

如果正常出错,没有强退。下载器会正常调用,写临时清单,这个不会有bug。


void AssetsManagerEx::startUpdate()
{
if (_updateState != State::NEED_UPDATE)
return; _updateState = State::UPDATING;
// Clean up before update
_failedUnits.clear();
_downloadUnits.clear();
_compressedFiles.clear();
_totalWaitToDownload = _totalToDownload = ;
_percent = _percentByFile = _sizeCollected = _totalSize = ;
_downloadedSize.clear();
_totalEnabled = false; // Temporary manifest exists, resuming previous download
if (_tempManifest->isLoaded() && _tempManifest->versionEquals(_remoteManifest))
{
std::unordered_map<std::string, Manifest::AssetDiff> diff_map = _localManifest->genDiff(_remoteManifest);
if (diff_map.size() == 0)
{
updateSucceed();
}
else
{
// Set other assets' downloadState to SUCCESSED
auto &assets = _remoteManifest->getAssets();
for (auto it = assets.cbegin(); it != assets.cend(); ++it)
{
const std::string &key = it->first;
auto diffIt = diff_map.find(key);
if (diffIt == diff_map.end())
{
_tempManifest->setAssetDownloadState(key, Manifest::DownloadState::SUCCESSED);
}
}
_tempManifest->genResumeAssetsList(&_downloadUnits);
_totalWaitToDownload = _totalToDownload = (int)_downloadUnits.size();
this->batchDownload(); std::string msg = StringUtils::format("Resuming from previous unfinished update, %d files remains to be finished.", _totalToDownload);
dispatchUpdateEvent(EventAssetsManagerEx::EventCode::UPDATE_PROGRESSION, "", msg);
}
}
// Check difference
else

 

遇到问题不要着急,一步一步确定问题。经常看官网的coco动态,新版本的发布,以及bug的修改、

Cocos2dx git

Cocos2dx 官网

Cocos2dx热更新遇到的那些坑的更多相关文章

  1. cocos2dx热更新tmx的一个坑

    游戏项目中使用了tmx地图,当对tmx文件进行热更新时,进入该地图总是宕机,纠结了几小时终于发现,cocos读取tmx文件时,会默认tmx关联的图集文件和tmx在同一目录,然而那个图集文件并没有在热更 ...

  2. ReactNative 使用微软的CodePush进行热更新,继续填坑

    1.别被开发环境骗了 在我们开发react native的时候,一键运行工程,js改了,只要cmd+R就可以刷新了.然后会轻易以为真正app上线的时候也是一样,只要app一打开就是最新的. 其实!这是 ...

  3. cocos2dx热更新之后,闪退问题记录。

    如果使用cocos2dx的3.17.2版本的官方热更新. 然后有玩家反馈说热更新之后游戏闪退,游戏内有部分资源没更到. 考虑如下几个方面调整. 1,在文件下载失败的时候,直接调用重新下载. 2,把下载 ...

  4. [COCOS2DX-LUA]0-003.根据COCOS2DX热更新

    一.最近有需求就是要基于COCOS2DX-LUA进行游戏的增量更新,找了资料,发现了COCOS2DX有自带一个热更新的类,就是AssetsManager,但是该接口对于我来说有以下的缺陷 1.版本号在 ...

  5. XLua热更新用法全流程总结(所有容易出问题的点)

    Xlua热更新流程总结 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创 ...

  6. cocos2dx js 3.2 热更新

    COCOS IDE用手机调试更新是正常的,是预想的结果,但用COCOS IDE打包发布APK,安装到手机上,热更新下载图片.JSON UI什么的都能正常更新替换,但JS脚本没有替换,这是为毛.更新文件 ...

  7. [Cocos2d-x]Lua 资源热更新

    什么是热更新 所谓的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端. 热更 ...

  8. ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解

    onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l  环境搭建 l  创建demo并 ...

  9. buglly热更新集成遇到的那些坑

    首先说明使用热修复的意义,那就是你的apk包发出去了,万一发生了紧急异常需要修复,怎么办?这时候再发包上市场审核,也是有点慢了吧?而且错误发生在apk中,无法通过后台接口修复,这时候你就需要一个强大的 ...

随机推荐

  1. partial类修饰符

    partial是一个类修饰符,用于把类定义拆分为几个部分,便于代码管理,如class ClassA{void A(){;}void B(){;}}与partial class ClassA{void ...

  2. java中集合框架

    java平台提供了一个全新的集合框架."集合框架"主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型. 在很大程度上,一旦您理解了接口,您就理解了框架.虽然您总要创建接 ...

  3. 解压文件--linux

    linux下不同的文件格式用不同的命令解压. 对于tar.gz文件,用以下命令. .tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileNa ...

  4. 主成分分析PCA(转载)

    主成分分析PCA 降维的必要性 1.多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯. 2.高维空间本身具有稀疏性.一维正态分布有68%的值落于正负标准差之 ...

  5. jQuery插件placeholder的使用方法

    借助该插件可以轻松实现HTML5中placeholder特效: 实例代码如下: <script type="text/javascript" src="<%= ...

  6. xml文档PHP查询代码(学习使用)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org ...

  7. CSS BUG 总结

    1.IE7 容器使用了滚动条  其子元素中使用 position:relative ,position变成了fixed,从而不随容器的滚动条滚动; 解决: 在其容器元素的属性中也加入 position ...

  8. flex chrome浏览器调试flex程序

    flex chrome浏览器调试出现空白的解决方法: 1,为chrome安装flash player,禁用chrome自带的flash player:参考:http://www.jb51.net/ar ...

  9. 变形transform的副作用

    前面的话   变形transform本来是一个用来处理移动.旋转.缩放和倾斜等基本操作的CSS3属性,但该属性除了完成其本职工作之后,还对普通元素造成了意想不到的影响,本文将详细介绍transform ...

  10. Eclipse安装git

    用Eclipse开发,如果需要团队协作,git作为分布式版本管理工具就是个比较好的选择.下面简单介绍一下git插件的安装方法: 1.Help -- install new software 打开插件安 ...