iOS 使用libcurl 获取网络请求各阶段的时间

最近因为要做网络检测,所以开始调研如何在iOS下获取请求的各项内容。比如首包时间、DNS解析时间、请求connect时间、SSL握手时间、下载速度、上传速度等等网络指标。这些数据如果是用iOS原生方法基本是没法获取的,iOS 10可以用系统的如下方法可以获取到这些信息:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

但如果iOS9及以下版本就不行了,这不行啊,只能继续琢磨琢磨。
又因为手上有另一个调研任务用到了libcurl,所以带着试试的态度去查了下,没想到,真的有办法!

下面,请看主角curl_easy_getinfo这个函数,libcurl的官方介绍文档是:https://curl.haxx.se/libcurl/c/curl_easy_getinfo.html
里面有详细的介绍,你想获取什么参数就点进去看Example范例代码,很简单的都是。给个获取DNS解析时间的范例,代码来自官方Example:

curl = curl_easy_init();
if(curl) {
  double namelookup;
  curl_easy_setopt(curl, CURLOPT_URL, url);
  res = curl_easy_perform(curl);
  if([CURLE_OK](https://curl.haxx.se/libcurl/c/libcurl-errors.html#CURLEOK) == res) {
    res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &namelookup);
    if([CURLE_OK](https://curl.haxx.se/libcurl/c/libcurl-errors.html#CURLEOK) == res) {
      printf("Time: %.1f", namelookup);
    }
}
/* always cleanup */
curl_easy_cleanup(curl);

简单吧,其余你想要获取的网络请求参数看官网范例吧,各类检测SDK,例如听云、友盟会不会也是通过这样获取的呢? : )

你可能感兴趣的:(iOS 使用libcurl 获取网络请求各阶段的时间)