iOS编译curl+OpenSSL并实现文件下载

iOS 下折腾curlopenssl,说实话,刚开始真挺麻烦的。但有时候,项目需求就是不能用NSURLSession,尤其涉及老代码或者跨平台库时,curl+openssl组合就派上用场了。

官方源码直接下:curl官网,openssl在 GitHub。下好后先解压,准备搞编译。记得环境要配好,Xcode + Command Line Tools是标配,不然一堆命令会直接报错。

openssl那一步最关键,命令类似:

./Configure darwin64-arm64-cc -prefix /你的输出目录 no-shared
make && make install

去搞curl,指定好--with-ssl路径,还有一堆--disable选项,能精简就精简,编译更快:

./configure --host=arm-apple-darwin --with-ssl=/path/to/openssl --disable-ftp --disable-file ...
make && make install

搞完之后,静态库就出来了,用.a文件直接集成到 Xcode 项目里,头文件也别忘了加。

下载文件的逻辑也不复杂,curl有标准 API,用个write_callback把数据写进沙盒路径:

#include 
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
  return fwrite(ptr, size, nmemb, (FILE *)stream);
}
int main() {
  FILE *fp = fopen("/沙盒路径/file", "wb");
  CURL *curl = curl_easy_init();
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/file");
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
  curl_easy_perform(curl);
  curl_easy_cleanup(curl);
  fclose(fp);
  return 0;
}

写代码前别忘了在Info.plistNSAppTransportSecurity设置,要么开启Allow Arbitrary Loads,要么加白名单域名。不然 HTTPS 连不上。

,这种做法虽然比较折腾,但在一些对网络协议控制比较细的场景里,还真挺有用的。如果你对NSURLSession不满意,又想自己掌控连接过程,试试看吧。

zip 文件大小:5.81MB