最近游戲把資源(圖片、配置、lua)的加載、更新全部改了 ,加載其實還好,就是不走之前的zip解壓方式。
以前的大體流程:
下載 –> 啟動 –> 解壓 –> 更新 –> 進入游戲
現在的大體流程:
下載 –> 啟動 –> 更新 –> 進入游戲
之前使用散文件gzip方式更新,現在換成下載zip包(斷點下載)
在改動完成之后准備提交appstore,結果崩潰的發現在某些設備上debug可以正常更新、release就始終有問題,一直失敗。后來在mac上安裝了http的抓包工具:HttpScope。發現在head請求之后就不再繼續走下去了,然后就猜測是否因為release的原因,導致寫入文件時遇到權限問題了,然后就打log,重新生成release包測試…
最后定位到的問題是,head請求始終返回的是0,代碼是這樣寫的:
m_pUrlHandle = curl_easy_init();
double dSize = 0.0f;
curl_easy_setopt(m_pUrlHandle, CURLOPT_URL, m_strRemoteFileUrl.c_str());
curl_easy_setopt(m_pUrlHandle, CURLOPT_HEADER, 1);
curl_easy_setopt(m_pUrlHandle, CURLOPT_NOBODY, 1);
if (curl_easy_perform(m_pUrlHandle) == CURLE_OK) {
curl_easy_getinfo(m_pUrlHandle, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &dSize);
} else {
dSize = 0.0f;
}
curl_easy_cleanup(m_pUrlHandle);
m_pUrlHandle = NULL;
改動就是去掉curl_easy_setopt(m_pUrlHandle, CURLOPT_HEADER, 1);
默認CURLOPT_NOPROGRESS為開啟的
CURLOPT_NOSIGNAL我也設置過,沒用。CURLOPT_HEADER如果打開,它會將頭信息輸出在body中,會不會是因為沒有設置CURLOPT_WRITEFUNCTION函數引起的問題呢?
仔細查curl的官方文檔http://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html,有這樣的發現:
也就是如果沒有設置CURLOPT_WRITEFUNCTION,那它會調用默認的fwrite方法,那它的路徑會是什么呢?不清楚,上面也沒寫,所以就有可能導致寫入失敗,從而導致得到的size始終為0