通过给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