quick-cocos2d-x的热更新机制实现<三>Updater(C++)

原文地址:http://www.cocoachina.com/bbs/read.php?tid=213061

3 Updater(C++)

AssetsManager 中提供了下载资源,访问更新列表,解压zip包,删除临时文件,设置搜索路径等等一系列的功能。但它的使用方式相当死板,我只能传递一个获取版本号的地址,一个zip包的地址,一个临时文件夹路径,然后就干等着。期间啥也干不了。
当然,我可以通过 quick 为其增加的 registerScriptHandler 方法让lua得知下载进度和网络状态等等。但下载进度的数字居然以事件名的方式通过字符串传过来的!这个就太匪夷所思了点。
于是,我对这个 AssetsManager 进行了修改。因为修改的东西实在太多,改完后就不好意思再叫这个名字了(其实主要是现在的名字比较短 XD)。我们只需要记住这个 Updater 是使用 AssetsManager 修改的即可。
在上面SunLightJuly和Henry同学的方法中,使用的是 CCHTTPRequest 来获取网络资源的。CCHTTPRequest 封装了cURL 操作。而在 Updater 中,是直接封装的 cURL 操作。
在我的设计中,逻辑应该尽量放在lua中,C++部分只提供功能供lua调用。因为lua可以进行热更新,而C++部分则只能整包更新。
Updater 主要实现的内容如下:
3.1 删除了不需要的方法
get和set相关的一堆方法都被删除了。new对象的时候也不必传递参数了。
3.2 增加 getUpdateInfo 方法
这个方法通过HTTP协议获取升级列表数据,获取到的数据直接返回,C++并不做处理。
3.3 修改 update 方法
这个方法通过HTTP协议下载升级包,需要提供四个参数:

  1. zip文件的url;
  2. zip文件的保存位置;
  3. zip 文件的解压临时目录;
  4. 解压之前是否需要清空临时目录。
3.4 修改事件类型
我把把传递给lua的事件分成了四种类型:
3.4.1 UPDATER_MESSAGE_UPDATE_SUCCEED
事件名为 success,代表更新成功,zip文件下载并解压完毕;
3.4.2 UPDATER_MESSAGE_STATE
事件名为 state,更新过程中的状态(下载开始、结束,解压开始、结束)也传递给了lua。这个方法是这样实现的:
复制代码
  1. void Updater::Helper::handlerState(Message *msg)
  2. {
  3.     StateMessage* stateMsg = (StateMessage*)msg->obj;
  4.     if(stateMsg->manager->_delegate)
  5.     {
  6.         stateMsg->manager->_delegate->onState(stateMsg->code);
  7.     }
  8.     if (stateMsg->manager->_scriptHandler)
  9.     {
  10.         std::string stateMessage;
  11.         switch ((StateCode)stateMsg->code)
  12.         {
  13.             case kDownStart:
  14.                 stateMessage = "downloadStart";
  15.                 break;
  16.                
  17.             case kDownDone:
  18.                 stateMessage = "downloadDone";
  19.                 break;
  20.                
  21.             case kUncompressStart:
  22.                 stateMessage = "uncompressStart";
  23.                 break;
  24.             case kUncompressDone:
  25.                 stateMessage = "uncompressDone";
  26.                 break;
  27.                
  28.             default:
  29.                 stateMessage = "stateUnknown";
  30.         }
  31.        
  32.         CCScriptEngineManager::sharedManager()
  33.             ->getScriptEngine()
  34.             ->executeEvent(
  35.                            stateMsg->manager->_scriptHandler,
  36.                            "state",
  37.                            CCString::create(stateMessage.c_str()),
  38.                            "CCString");
  39.     }
  40.    
  41.     delete ((StateMessage*)msg->obj);
  42. }



3.4.3 UPDATER_MESSAGE_PROGRESS
事件名为 progress,传递的对象为一个 CCInteger ,代表进度。详细的实现可以看  源码
3.4.4 UPDATER_MESSAGE_ERROR
事件名为 error,传递的对象是一个 CCString,值有这样几个:
  • errorCreateFile
  • errorNetwork
  • errorNoNewVersion
  • errorUncompress
  • errorUnknown
方法的实现和上面的 UPDATER_MESSAGE_STATE 类似,这里就不贴了。详细的实现可以看  源码
Updater(C++) 部分只做了这些苦力工作,而具体的分析逻辑(分析getUserInfo返回的数据决定是否升级、如何升级和升级什么),下载命令的发出(调用update方法),解压成功之后的操作(比如合并新文件到就文件中,更新文件索引列表等等),全部需要lua来做。下面是一个处理Updater(C++)事件的lua函数的例子。


复制代码
  1. function us._updateHandler(event, value)
  2.     updater.state = event
  3.     if event == "success" then
  4.         updater.stateValue = value:getCString()
  5.         -- 成功之后更新资源列表,合并新资源
  6.         updater.updateFinalResInfo()
  7.         -- 调用成功后的处理函数
  8.         if us._succHandler then
  9.             us._succHandler()
  10.         end
  11.     elseif event == "error" then
  12.         updater.stateValue = value:getCString()
  13.     elseif event == "progress" then
  14.         updater.stateValue = tostring(value:getValue())
  15.     elseif event == "state" then
  16.         updater.stateValue = value:getCString()
  17.     end
  18.     -- us._label 是一个CCLabelTTF,用来显示进度和状态
  19.     us._label:setString(updater.stateValue)
  20.     assert(event ~= "error",
  21.         string.format("Update error: %s !", updater.stateValue))
  22. end
  23. updater:registerScriptHandler(us._updateHandler)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值