第一种情况是 直接从网页上获取一个字符串,常用于游戏的版本号获取之类的,处理方法如下:
CURL* curl;
CURLcode res;
char buffer[10] ={0};
curl = curl_easy_init();//curl初始化
std::string _version;
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "https://raw.github.com/minggo/AssetsManagerTest/master/version");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);//设为不验证证书
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getVersionCode);//设置处理数据的函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &_version);//数据存储的对象指针
res = curl_easy_perform(curl);//curl链接
curl_easy_cleanup(curl);//清除curl
}
static size_t getVersionCode(void *ptr, size_t size, size_t nmemb, void *userdata)
{//参数userdata是存放数据的指针 其他三个获取内容
std::string *version = (std::string*)userdata;
version->append((char*)ptr, size * nmemb);
return (size * nmemb);
}
另一种情况则是需要从网上下载更新包
string outFileName = _storagePath + TEMP_PACKAGE_FILE_NAME;//下载文件的存放位置
FILE *fp = fopen(outFileName.c_str(), "wb");//新建并打来一个文件 以便下载后写入
if (! fp)
{
sendErrorMessage(kCreateFile);
CCLOG("can not create file %s", outFileName.c_str());
return false;
}
// Download pacakge
CURLcode res;
curl_easy_setopt(_curl, CURLOPT_URL, _packageUrl.c_str());//设定curl的链接
curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, downLoadPackage);
curl_easy_setopt(_curl, CURLOPT_WRITEDATA, fp);//设置将data写入到文件流fp中
curl_easy_setopt(_curl, CURLOPT_NOPROGRESS, false);//设为false 下面才能设置进度响应函数
curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, assetsManagerProgressFunc);//进度响应函数
curl_easy_setopt(_curl, CURLOPT_PROGRESSDATA, this);//数据传输的对象
res = curl_easy_perform(_curl);
curl_easy_cleanup(_curl);
if (res != 0)
{
CCLOG("error when download package");
fclose(fp);
return false;
}
CCLOG("succeed downloading package %s", _packageUrl.c_str());
fclose(fp);
数据写入函数跟之前的getVersionCode差不多 只是向不同的对象写入 用的函数也不一样
static size_t downLoadPackage(void *ptr, size_t size, size_t nmemb, void *userdata)
{
FILE *fp = (FILE*)userdata;
size_t written = fwrite(ptr, size, nmemb, fp);
return written;
}
进度条响应函数的功能主要是 更新下载的进度 即为 (int)nowDownloaded/totalToDownload*100
assetsManagerProgressFunc(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded)
当然更新包下载下来,还需要解压,替换等步骤,留待下文