iOS網絡數據指標收集

在平時開發中有時候需要收集網絡不同階段性能數據來分析網絡情況,下面總結了2種收集方式。
1.通過NSURLSession提供的代理方法收集
2.通過NSURLProtocol做統一網絡請求攔截收集

通過NSURLSession提供的代理方法收集
當NSURLSessionTask完成並返回響應時,NSURLSession會收集一些關於任務運行的性能指標,如請求時間、響應時間、傳輸速度、重定向次數等等。這些指標會被包裝成NSURLSessionTaskMetrics對象,並在任務完成時傳遞給代理對象。在這個方法中可以對這些指標進行處理和記錄,以便對網絡性能進行分析和優化。
@interface MySessionDelegate : NSObject <NSURLSessionDelegate>

@end

@implementation MySessionDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics {
    // 打印出請求的各項指標
    for(NSURLSessionTaskTransactionMetrics *transaction in metrics.transactionMetrics) {
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)transaction.response;
        NSLog(@"Request URL: %@", transaction.request.URL);
        NSLog(@"HTTP Status Code: %ld", (long)response.statusCode);
        NSLog(@"Request Start Time: %@", transaction.startDate);
        NSLog(@"Request End Time: %@", transaction.endDate);
        NSLog(@"Request Duration: %f", [transaction.duration doubleValue]);
        NSLog(@"Bytes Sent: %lld", transaction.countOfRequestBodyBytesSent);
        NSLog(@"Bytes Received: %lld", transaction.countOfResponseBodyBytesReceived);
        NSLog(@"Redirection Count: %lu", (unsigned long)transaction.redirectCount);
        NSLog(@"Request Method: %@", transaction.request.HTTPMethod);
    }
}

@end

 

通過NSURLProtocol做統一網絡請求攔截收集
NSURLProtocol是自定義URL加載系統的一部分,允許開發者攔截URL請求並做自定義的邏輯處理。
NSURLProtocol的主要作用是在URL請求和URL響應之間添加攔截器,提供了對URL請求的攔截和處理的能力。
NSURLProtocol常用方法說明
canInitWithRequest::用於判斷是否需要處理該請求,如果返回YES,則會繼續調用其他方法處理該請求,如果返回NO,則會終止處理該請求。
canonicalRequestForRequest::用於獲取規範化的請求對象,可以在這裏修改請求頭等信息。
startLoading::用於開始處理請求,可以在這裏發起網絡請求、讀取本地緩存等操作。
stopLoading::用於停止處理請求,通常在此方法中取消網絡請求、關閉文件等操作。
NSURLProtocol的使用非常靈活,可以用於實現自定義的網絡攔截器、緩存策略、調試工具等。
代碼舉例
@interface MyURLProtocol : NSURLProtocol

@end

@interface MyURLProtocol()

@property(nonatomic, strong) NSURLConnection *connection;
@property(atomic, strong) NSMutableData *receivedData;

@end

@implementation MyURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    if ([NSURLProtocol propertyForKey:kCustomURLProtocolKey inRequest:request]) {
        return NO;
    }
    
#if defined(Debug)
    return YES;
#elif defined(Release)
    return NO;
#endif
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

- (void)startLoading {
    NSMutableURLRequest *mutableRequest = [[self request] mutableCopy];
    [NSURLProtocol setProperty:@YES forKey:kCustomURLProtocolKey inRequest:mutableRequest];
    self.connection = [NSURLConnection connectionWithRequest:mutableRequest delegate:self];
}

- (void)stopLoading {
    [self.connection cancel];
    self.connection = nil;
}

#pragma mark - NSURLConnection Delegate

#pragma mark - NSURLConnection Delegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [[self client] URLProtocol:self didReceiveResponse:response
            cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [[self client] URLProtocol:self didLoadData:data];
    
    if (self.receivedData == nil) {
        self.receivedData = [[NSMutableData alloc] init];
    }
    
    [self.receivedData appendData:data];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSURLRequest *logRequest = [self.request copy];
    NSData *data = [self.receivedData copy];
    [[self client] URLProtocolDidFinishLoading:self];
    self.connection = nil;
#if defined(Debug)
    dispatch_async(dispatch_get_main_queue(), ^{
        [[LogManager sharedInstance] addNetworkLog:logRequest response:data];
    });
#else
    dispatch_async(dispatch_get_main_queue(), ^{
        [[LogManager sharedInstance] addNetworkLog:logRequest response:data];
    });
#endif
    
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [[self client] URLProtocol:self didFailWithError:error];
    self.connection = nil;
}

@end

 

 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章