按理说,是从头梳理cocos2dx,但是最近的需求。开始梳理学习AssetsManager。
AssetsManager 的使用分步骤看:
1.create obj
1 pAssetsManager = new AssetsManager("https://raw.github.com/minggo/AssetsManagerTest/master/package.zip", 2 "https://raw.github.com/minggo/AssetsManagerTest/master/version", 3 pathToSave.c_str());
三个参数:AssetsManager(资源zip包,资源版本号,下载zip后的保存路径)
2.add Listener
1 pAssetsManager->setDelegate(this);
AssetsManager的三个回调方法:
1 virtual void onError(cocos2d::extension::AssetsManager::ErrorCode errorCode); 2 virtual void onProgress(int percent); 3 virtual void onSuccess();
使用回调的时候,需要让对应的类继承cocos2d::extension::AssetsManagerDelegateProtocol。然后重写上面的三个方法。
AssetsManager源码:===========================
void AssetsManager::setDelegate(AssetsManagerDelegateProtocol *delegate)
{
_delegate = delegate;
}
=========================================
3.timeout time setting
1 pAssetsManager->setConnectionTimeout(3);
网络连接,超时时间的设置。
4.start update resource.
1 getAssetsManager()->update();
执行update下载的时候分为3步骤:
4.1 检查三个参数, (zip, versioncode, output dir)
4.2 检查更新,(判断本地记录的版本跟服务器上面的版本号是否一致,如果版本号相等,则没有发现新版本。)
4.3 创建线程Thread,下载,解压 ,更新
5.reset or delete version record
1 // Delete recorded version codes. 2 getAssetsManager()->deleteVersion();
如果有需要,可以重置记录在本地的versioncode的userdefault的xml文件
看本地的版本生成文件userdefault.xml:
<?xml version="1.0" encoding="UTF-8"?>
<userDefaultRoot>
<current-version-code>1.1</current-version-code>
<downloaded-version-code></downloaded-version-code>
</userDefaultRoot>
current-version-code 指的是当前的本地的版本号。
(这样,在应用每次检查更新的时候,就会读取这个版本号,用来跟服务器上的版本号进行比对,如果不一致,就下载
(不存在是否版本号谁大谁小关系(源码就是这样写的)))
downloaded-version-code 在下载zip资源文件成功时,设置此时服务器上面的版本号,
紧接着,解压..........................解压完成后,立刻又将downloaded-version-code设置成空。
所以在程序角度看,这个值永远是空值的。。(除非是已经下载了,但是没有解压。)
这样做的好处是:。。。。我猜想,可能是设计者怕在解压的过程中,程序挂了,解压也没有完成。
这样,downloaded-version-code 就有值了,也就是在服务器上下载的最新zip包的版本(本地也有对应的最新zip包)。
下次当再次启动应用,请求服务器的时候,就不用下载zip包了,而是直接进入解压步骤。
下载完成以后:
1 // Record new version code. 2 UserDefault::getInstance()->setStringForKey(this->keyOfVersion().c_str(), this->_version.c_str()); 3 4 // Unrecord downloaded version code. 5 UserDefault::getInstance()->setStringForKey(this->keyOfDownloadedVersion().c_str(), ""); 6 UserDefault::getInstance()->flush(); 7 8 // Set resource search path. 9 this->setSearchPath(); 10 11 // Delete unloaded zip file. 12 string zipfileName = this->_storagePath + TEMP_PACKAGE_FILE_NAME; 13 if (remove(zipfileName.c_str()) != 0) 14 { 15 CCLOG("can not remove downloaded zip file %s", zipfileName.c_str()); 16 } 17 18 if (this->_delegate) this->_delegate->onSuccess();
上面的代码:记录当前本地的版本号:current-version-code
删除已经下载的版本号:downloaded-version-code
设置优先资源路径
删除下载的zip资源文件
发送通知消息,表明成功完成了下载解压更新。
整个过程是只下载了一个zip更新。也就是属于一次性的更新。(整个过程只有一个userdefault.xml文件)
考虑如果有多个模块需要更新呢...(~~~~~还是具体情况具体对待~~~~~~)
嗯。over...学习了大神的代码~