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

Flutter 异步编程指南

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

Flutter 异步编程指南

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

iOS开发之弹窗管理

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

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

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

iOS 单元测试之常用框架 OCMock 详解

测试驱动开发并不是一个很新鲜的概念了。在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候,往往是用模拟器一次一次的从头开始启动 app,然后定位到自己所在模块的程序,做一系列的点击操作,然后查看结果是否符合自己预期。

从 iOS App 启动速度看如何为基础性能保驾护航

启动是App给用户的第一印象,一款App的启动速度,不单单是用户体验的事情,往往还决定了它能否获取更多的用户。所以到了一定阶段App的启动优化是必须要做的事情。

iOS转场之present与dismiss的使用

present的使用方式 present只能是A present B , B present C , C present D这样的链式弹出。 不能A present B , A present C , A present D这样的叠加弹出,会报错。 dismiss的使用方法 dismiss是底部父V

iOS 常用命令行工具总结

平时工作中会经常用到命令行工具Command Lines Tool。而Command Line Tool本质是一个命令行工具包,内部有很多有用的工具,如Apple LLVM compiler、Make等。而它里面中的一部分工具属于 LLVM 序列,比如dwarfdump、ar其本质为llvm-dwa

集成Unity3D到iOS应用程序中

如果想让原生平台(例如 Java/Android、Objective C/iOS 或 Windows Win32/UWP)包含 Unity 功能,可以通过Unity 生成UnityFramework静态库包含到项目中进行实现。 Unity 从2019.3 开始支持将 Unity 运行时组件集成到原生