iOS 使用libcurl 獲取網路請求各階段的時間

Auditore發表於2018-01-03

最近因為要做網路檢測,所以開始調研如何在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,例如聽雲、友盟會不會也是通過這樣獲取的呢? : )

相關文章