文档

iOS端获取DNS解析时间指南

更新时间:

本文档介绍了在 iOS 上进行网络请求时,获取 DNS 解析时间的方法。

1.概述

在iOS端正常进行网络请求时,可以通过NSURLSessionDelegate中的代理方法获得LocalDns的解析时间,如果您接入了阿里云公共DNS SDK,那么SDK会绕过LocalDns进行域名解析过程,此时获取DNS解析时间,只需在SDK的解析API前后分别获取时间然后取差值即可。

2.方案

  • 获得LocalDns的解析时间

#pragma mark URLSession Delegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics {
    if ([metrics.transactionMetrics count] <= 0) return;
    [metrics.transactionMetrics enumerateObjectsUsingBlock:^(NSURLSessionTaskTransactionMetrics *_Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {
        if (obj.resourceFetchType == NSURLSessionTaskMetricsResourceFetchTypeNetworkLoad) {
            NSLog(@"%@",[NSString stringWithFormat:@"请求URL:%@",[obj.request.URL absoluteString]]);
            NSLog(@"%@",[NSString stringWithFormat:@"服务器IP:%@",obj.remoteAddress]);

            NSURLSessionTaskMetricsDomainResolutionProtocol dnsProtocol = obj.domainResolutionProtocol;
            NSLog(@"%@",[NSString stringWithFormat:@"DNS类型为 %ld", (long)dnsProtocol]);
            NSLog(@"%@",[NSString stringWithFormat:@"0:未知,1:UDP,2:TCP,3:TLS,4:HTTPS"]);
            if (obj.domainLookupStartDate && obj.domainLookupEndDate) {
                int dnsLookupTime = ceil([obj.domainLookupEndDate timeIntervalSinceDate:obj.domainLookupStartDate] * 1000);
                NSLog(@"%@",[NSString stringWithFormat:@"DNS开始时间:%@,DNS结束时间:%@", obj.domainLookupStartDate, obj.domainLookupEndDate]);
                NSLog(@"%@",[NSString stringWithFormat:@"DNS解析时长 单位ms:%d",dnsLookupTime]);
            }
        }
    }];
}
  • 获取阿里云公共DNS SDK域名解析时间

CFTimeInterval startTimer = CACurrentMediaTime();
//替换为您使用的SDK解析方法
[[DNSResolver share] getIpv4DataWithDomain:@"main.m.taobao.com" complete:^(NSArray<NSString *> *dataArray) {
    CFTimeInterval endTimer = CACurrentMediaTime();
    UInt32 rtt = (endTimer - startTimer) * 1000;
    NSLog(@"%@",[NSString stringWithFormat:@"DNS解析时长 单位ms:%d",rtt]);                   
}];