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

  1. ios 网络数据下载和JSON解析

    ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...

  2. 浅议iOS网络数据解析

    /*------------------------------------ 数据解析: 1.JSON数据 --------------------------------*/ 重点:1.什么是JSO ...

  3. ios的网络数据下载和json解析

    ios的网络数据下载和json解析 简介 在本文中,笔者将要给大家介绍如何使用nsurlconnection 从网上下载数据,以及解析json数据格式,以及如何显示数据和图片的异步下载显示. 涉及的知 ...

  4. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  5. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  6. iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  7. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  8. ios网络学习------6 json格式数据的请求处理

    ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...

  9. iOS - NetRequest 网络数据请求

    1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...

  10. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

随机推荐

  1. mac快捷键和win10快捷键和mma快捷手册

    不定期更新 来自知乎,b站等 mac下的快捷键 如果你mac接了个不一致的键盘,mac会让你检测,(按左ctrl右边的键,按右ctrl左边的键),之后会进行键位映射,这也太复杂了,我拒绝记录. com ...

  2. springboot 接入 ChatGPT

    项目地址 https://gitee.com/Kindear/lucy-chat 介绍 lucy-chat是接入OpenAI-ChatGPT大模型人工智能的Java解决方案,大模型人工智能的发展是不可 ...

  3. java 环境变量配置详细教程(2023 年全网最详细)

    前言: 在上一篇文章中,壹哥给大家重点讲解了 Java 实现跨平台的原理,不知道你现在有没有弄清楚呢?如果你还有疑问,可以在评论区留言- 之前的三篇文章,主要是理论性的内容,其实你暂时跳过不看也是可以 ...

  4. GUI编程--3 Swing

    GUI编程-3 Swing 3.1 JFrame 窗口 窗口: package com.ssl.lesson04; import javax.swing.*; import java.awt.*; p ...

  5. 云原生K8S精选的分布式可靠的键值存储etcd原理和实践

    @ 目录 概述 定义 应用场景 特性 为何使用etcd 术语 架构 原理 读操作 写操作 日志复制 部署 单示例快速部署 多实例集群部署 静态 etcd 动态发现 常见命令 概述 定义 etcd 官网 ...

  6. $\mathcal{2023WinterHoliday}$刷题总结

    \(\mathcal{2023WinterHoliday}\) \(\mathcal{CTF}\) \(\mathcal{web}\) 1.\(json格式:\)$json['x']=="w ...

  7. Linux(五)用户管理与文件权限

    1 常用的基本命令 Shell可以看作一个命令解释器,为我们提供一个交互式的文本控制台界面,可以通过终端控制台来输入命令,由shell进行解释并最终交给linux内核运行.可以看作用户和硬件的桥梁. ...

  8. Golang一日一库之logrus

    前言 之前一篇文章介绍了 日志库zap https://www.cnblogs.com/zichliang/p/17311480.html 毋庸置疑,zap库无论是Golang在项目中 还是生产中都极 ...

  9. 安装vue-lic

    vue-cli是Vue.js开发的标准工具.它简化了程序员基于webppack创建工程化的Vue项目的过程.引用自vue-cli官网上的一句话:程序员可以专注在撰写应用上,而不必花好几天去纠结webp ...

  10. SMBMS超市管理系统(Javaweb项目)

    SMBMS超市管理系统(Javaweb项目) 项目环境 jdk 1.8.0_261 mysql 8.0.21 IDEA 2021.2.2 项目架构 数据库 项目源代码 filer 字符编码过滤器 pa ...