iOS网络数据指标收集

iOS,网络,数据,指标 · 浏览次数 : 27

小编点评

**通过NSURLSession提供的代理方法收集网络性能数据** 1. 在 NSURLSession 的代理对象中定义一个 `URLSessionTaskMetrics` 自定义类型。 2. 当 `URLSessionTask` 完成时,代理对象会回调代理方法 `URLSession:didFinishCollectingMetrics:`,其中参数是一个 `NSURLSessionTaskMetrics` 对象。 3. 在代理方法中,遍历 `metrics.transactionMetrics`,打印每个请求的指标,包括请求 URL、响应状态码、请求开始和结束时间、请求时长、请求方法等。 **通过NSURLProtocol做统一网络请求拦截收集通过NSURLSession提供的代理方法** 1. 实现一个 `MyURLProtocol` subclass,继承 `NSURLProtocol`。 2. 在 `canInitWithRequest:` 方法中,检查请求是否应该被处理。 3. 在 `canonicalRequestForRequest:` 方法中,创建规范化的请求对象。 4. 在 `startLoading` 和 `stopLoading` 方法中,处理网络请求和响应。 5. 在 `didReceiveResponse:` 和 `didReceiveData:` 方法中,处理响应数据。 6. 在 `connectionDidFinishLoading` 和 `connectionDidFailWithError:` 方法中,处理网络错误。 **总结** 通过使用代理方法,您可以收集 NSURLSession 中的性能指标,例如请求时间、响应时间、传输速度等。通过使用 NSURLProtocol,您可以更灵活地进行网络请求拦截和处理。

正文

在平时开发中有时候需要收集网络不同阶段性能数据来分析网络情况,下面总结了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

 

 
 
 

与iOS网络数据指标收集相似的内容:

iOS网络数据指标收集

在平时开发中有时候需要收集网络不同阶段性能数据来分析网络情况,下面总结了2种收集方式。 1.通过NSURLSession提供的代理方法收集 2.通过NSURLProtocol做统一网络请求拦截收集 通过NSURLSession提供的代理方法收集 当NSURLSessionTask完成并返回响应时,N

iOS开发基础109-网络安全

在iOS开发中,保障应用的网络安全是一个非常重要的环节。以下是一些常见的网络安全措施及对应的示例代码: Swift版 1. 使用HTTPS 确保所有的网络请求使用HTTPS协议,以加密数据传输,防止中间人攻击。 示例代码: 在Info.plist中配置App Transport Security (

Flutter 异步编程指南

在 App 开发中,经常会遇到处理异步任务的场景,如网络请求、读写文件等。Android、iOS 使用的是多线程,而在 Flutter 中为单线程事件循环

Flutter 异步编程指南

在 App 开发中,经常会遇到处理异步任务的场景,如网络请求、读写文件等。Android、iOS 使用的是多线程,而在 Flutter 中为单线程事件循环

iOS开发基础136-防暴力点击

要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤: 第一步:引入Aspects库 首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,

iOS开发基础133-崩溃预防

现代移动应用的用户体验依赖于其稳定性和可靠性。然而,在开发过程中,我们时常会遇到各种崩溃问题。崩溃不仅会影响用户的使用体验,还可能损害应用的声誉。因此,本文将详细介绍一个名为CrashPrevention的工具类,它能够为iOS开发者提供多方面的崩溃预防措施,借助该工具类,开发者能够有效减少崩溃的发

iOS开发基础102-后台保活方案

iOS系统在后台执行程序时,有严格的限制,为了更好地管理资源和电池寿命,iOS会限制应用程序在后台的运行时间。然而,iOS提供了一些特定的策略和技术,使得应用程序可以在特定场景下保持后台运行(即“后台保活”)。以下是iOS中几种常见的后台保活方案,并附上示例代码: 一、后台任务 利用beginBac

iOS开发之弹窗管理

前言 “千淘万漉虽辛苦,吹尽狂沙始到金。”在这快速变化的互联网行业,身边的朋友有的选择了勇敢创业,有的则在技术的海洋中默默耕耘。时常在深夜反思,作为一个开发者,我们的价值何在?答案或许就在那行代码中,润物细无声。以下是我在日常开发中封装的一个弹窗管理工具——CLPopoverManager,希望能为

iOS开发基础135-Core Data

Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省时间,还能减少编程错误。以下是使用 Core Data 的详细介绍,包括示例代码,以及深入底层的一些

【iOS逆向与安全】iOS远程大师:通过H5后台远程查看和协助iPhone设备

在移动设备测试和远程协助的过程中,能够远程查看和协助iPhone设备是一项非常实用的功能。为了解决这一需求,我开发了一款名为**iOS远程大师**的产品,允许用户通过H5后台界面查看和协助越狱或非越狱的iPhone设备。本文将详细介绍iOS远程大师的开发过程和技术实现。