首页 > 其他分享 >iOS网络数据指标收集

iOS网络数据指标收集

时间:2023-05-30 19:00:29浏览次数:33  
标签:transaction 请求 收集 NSLog self iOS 网络 connection 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

 

     

标签:transaction,请求,收集,NSLog,self,iOS,网络,connection,NSURLProtocol
From: https://www.cnblogs.com/zhou--fei/p/17444111.html

相关文章

  • docker学习笔记:docker常见网络类型及使用
    docker网络类型四类网络模式Docker网络模式配置说明host模式–net=host容器和宿主机共享Networknamespace。container模式–net=container:NAME_or_ID容器和另外一个容器共享Networknamespace。kubernetes中的pod就是多个容器共享一个Networknamespace。......
  • windows驱动开发之网络双机调试(三)
    一、配置目标计算机首先在被调试机上也安装上WDK环境,随后在WDK的安装目录下运行该工具 WDKTestTargetSetup,默认路径:C:\ProgramFiles(x86)\WindowsKits\10\Remote\x64\WDKTestTargetSetupx64-x64_en-us.msi;在之后调试机中的 VisualStudio 将连接被调试机的 WDK......
  • Unity发布IOS发布Android版本出现屏幕问题 UGUI半屏被压缩 另一半黑屏
    项目场景:用Unity做的app发布的ios和Android版本,ui做屏幕自适应,来适配多机型,unity版本是2019.4,用的UGUI。问题描述:极个别机型有个偶发的问题,就是在app息屏,再开屏的时候,会出现半边屏幕被压缩,半边屏幕黑屏的问题,但是ui交互的位置还是正常的,bug效果图如下:跟这张图一样的<hrstyle="bor......
  • 在树莓派上使用numpy实现简单的神经网络推理,pytorch在服务器或PC上训练好模型保存成nu
    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是mlp识别mnist手写数字识别训练代码在电脑上,cpu就能训练,很快的:1importtorch2importtorch.nnasnn3importtorch.optimasoptim4fromtorchvisionimportdatasets,transfor......
  • 【网络基础】DNS 原理入门
    1  前言今天我们来看看DNS,DNS是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。2  DNS是什么?DNS(DomainNameSystem的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本。举例来说,如果你要访问域名math.stackexc......
  • 微信小程序 WXSS模板样式,全局和页面配置,网络请求
    【黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)】https://www.bilibili.com/video/BV1834y1676P/?p=26&share_source=copy_web&vd_source=03c1dc52eeb3747825ecad0412c18ab1WXSS模板样式1.什么是WXSSWXSS(WeiXin......
  • java 网络通讯:tcp,upd,http
    java网络通讯:tcp,upd,http1.TCP通信服务端用的代表类:ServerSocket类,注册端口。调用accept()方法阻塞等待接收客户端连接。得到Socket对象。TCP通信的基本原理?客户端怎么发,服务端就应该怎么收。客户端如果没有消息,服务端会进入阻塞等待。Socket一方关闭或者出现异常、对方......
  • 基于DNN网络的信道估计matlab仿真,仿真输出信道估计值的mse指标
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       在信道变化迅速的系统中,通常依靠频域的导频子载波进行信道估计。导频子载波按照特定的规则插入到时频两维资源中。导频子载波处的信道响应可以通过最小二乘法(least-square,ls)和线性......
  • 基于DNN网络的信道估计matlab仿真,仿真输出信道估计值的mse指标
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要在信道变化迅速的系统中,通常依靠频域的导频子载波进行信道估计。导频子载波按照特定的规则插入到时频两维资源中。导频子载波处的信道响应可以通过最小二乘法(least-square,ls)和线性最小均方误差法(linearminimumm......
  • 网络如何工作
    详细的DNS什么是域名DNS(域名系统)为我们提供了一种简单的方式来与互联网上的设备进行通信,而无需记住复杂的数字。就像每个房子都有一个唯一的地址可以直接向它发送邮件一样,互联网上的每台计算机都有自己唯一的地址来与之通信,称为IP地址。IP地址如下所示104.26.10.229,4组数......