iOS 无侵入的实现网络请求各个阶段的时间监测

1,597 阅读1分钟

通过给AFURLSessionManager创建分类拦截NSURLSessionTaskDelegate 来实现:

具体是拦截- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics

AFURLSessionManager+LogRequestTime.h

#import "AFURLSessionManager.h"

NS_ASSUME_NONNULL_BEGIN

@interface AFURLSessionManager (LogRequestTime)

@end

NS_ASSUME_NONNULL_END

AFURLSessionManager+LogRequestTime.m

#import "AFURLSessionManager+LogRequestTime.h"


@implementation AFURLSessionManager (LogRequestTime)

#pragma mark - NSURLSessionTaskDelegate

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics  API_AVAILABLE(ios(10.0)){

   //DNS查询时间
    NSInteger dns_time = [self getDifTime:metrics.transactionMetrics[0].domainLookupStartDate endTime:metrics.transactionMetrics[0].domainLookupEndDate];
    
   
    //connect时间
    NSInteger connect_time = [self getDifTime:metrics.transactionMetrics[0].connectStartDate endTime:metrics.transactionMetrics[0].connectEndDate];
   
    //请求时间+ 响应时间
    NSInteger request_response_time = [self getDifTime:metrics.transactionMetrics[0].requestStartDate endTime:metrics.transactionMetrics[0].requestEndDate] + [self getDifTime:metrics.transactionMetrics[0].responseStartDate endTime:metrics.transactionMetrics[0].responseEndDate] + connect_time + dns_time;
    
   //如果满足上报条件就上报
        if (isConfig) {
            //上报
        }
    }

}

-(long long)getDateTimeTOMilliSeconds:(NSDate *)datetime
{
    NSTimeInterval interval = [datetime timeIntervalSince1970];
    long long totalMilliseconds = interval*1000 ;
    if (totalMilliseconds < 0) {
        totalMilliseconds = 0;
    }
    return totalMilliseconds;
}

- (long long)getDifTime:(NSDate *)startTime endTime:(NSDate *)endTime{

    return [self getDateTimeTOMilliSeconds:endTime] - [self getDateTimeTOMilliSeconds:startTime];

}


@end