按理說,是從頭梳理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...學習了大神的代碼~