iOS拦截http请求 ( 为小白用户定制的精简版本)

简介: iOS拦截http请求 ( 为小白用户定制的精简版本)

引言

今天用户Naruto反馈之前的demo:https://download.csdn.net/download/u011018979/16768533有点复杂,因为他的需求是只要拖入我自定义的NSURLProtocol子类到动态库,就可以自动拦截http请求。

针对他的要求,今天特意写了一个简单的demo。

其实就是由原来的手动注册我们的协议类,使用了小技巧,采用分类的形式在load方法进行自动注册而已

目前demo是只要加载NSURL类就会自动注入我自定义NSURLProtocol子类进行http 拦截,当然你也可以更换到其他分类,不一定是NSURL(只要是你觉得会触发的类都行)

image.png

本文demo下载地址https://download.csdn.net/download/u011018979/16840774

I、原理

1、基于NSURLProtocol拦截请求:

HTTP 请求开始时,URL 加载系统创建一个合适的 NSURLProtocol 对象处理对应的 URL 请求,因此我们只需写一个继承自 NSURLProtocol 的类,并通过 - registerClass: 方法注册我们的协议类,然后 URL 加载系统就会在请求发出时使用我们创建的协议对象对该请求进行处理。

2、采用分类的形式在load方法进行自动注册协议类

II、基于NSURLProtocol拦截http请求

  • 自定义NSURLProtocol子类
  • 对[KNURLProtocol shareInstance].requestBlock =进行赋值;因为拦截的请求会交给requestBlockForRequst处理;可在这个block打印请求信息进行调试验证
  • 注册协议类:

方式一:在app启动的时候调用KNURLProtocol的addRequestBlock方法进行 方式二:采用分类的形式在load方法进行自动注册协议类(针对动态库/静态库项目)

2.1、采用分类的形式在load方法进行自动注册协议类

#import "NSURL+registerURLProtocolClass.h"
@implementation NSURL (registerURLProtocolClass)
+(void)load{
    [super load];
    [self requestBlock];
}
#pragma mark 拦截全局请求
+ (void)requestBlock{
    [KNURLProtocol handleRequest:^NSURLRequest *(NSURLRequest *request) {
        NSLog(@"拦截到请求-%@",request);
        dispatch_async(dispatch_get_main_queue(), ^{
//            self.blockTv.text = [self.blockTv.text stringByAppendingString:[NSString stringWithFormat:@"拦截到请求--%@\n",request]];
        });
        return request;
    }];
}

2.2、 自定义NSURLProtocol子类

  • 核心方法
/**
 决定请求是否需要当前协议对象处理
 问:是自动拦截?
 答:是,你可以自己写个开关 或者自己定义拦截规则
 目前demo只是判断是URL 就进行拦截 (isUrl)
 协议类的注册,可采用分类的形式在load方法进行自动注册
 */
+(BOOL)canInitWithRequest:(NSURLRequest *)request{
    if ([NSURLProtocol propertyForKey:protocolKey inRequest:request]) {
        return NO;
    }
    NSString * url = request.URL.absoluteString;
    return [self isUrl:url];
}
/**
 对当前的请求对象需要进行哪些处理
 */
+(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return [[KNURLProtocol shareInstance] requestBlockForRequst:request];
}
-(NSURLRequest *)requestBlockForRequst:(NSURLRequest *)request{
    if(self.requestBlock){
        return self.requestBlock(request);
    }else{
        return request;
    }
}
  • KNURLProtocol.h
//
//  KNURLProtocol.h
//  KNURLProtocolDemo
//
//  Created by mac on 2021/4/19.
//
#import <Foundation/Foundation.h>
#import "HSSingleton.h"
typedef NSURLRequest *(^requestBlock) (NSURLRequest *request);
NS_ASSUME_NONNULL_BEGIN
@interface KNURLProtocol : NSURLProtocol
@property (nonatomic, copy) NSURLRequest *(^requestBlock)(NSURLRequest *request);
HSSingletonH(Instance);
/**
 拦截全局请求
 @param block 请求回调,block返回修改后的请求
 */
+(void)handleRequest:(requestBlock)block;
/**
 禁止所有网络请求
 */
+(void)cancelAllRequest;
/**
 恢复所有网络请求
 */
+(void)resumeAllRequest;
@end
NS_ASSUME_NONNULL_END
  • KNURLProtocol.m

see also

  • 创建分类的入口

image.png

image.png

从CSDN下载demo资源:https://download.csdn.net/download/u011018979/167685331、文章:https://kunnan.blog.csdn.net/article/details/115690756 2、应用场景:2.1、 自定义请求头的HTTPHeaderField 2.2、针对NSURLSessionConfiguration设置代理IP和端口,让一些特殊的请求走自定义的隧道IP和端口 2.3、对网络请求的数据进行报文级别的加密:使用NSURLProtocol来自动监听HTTP请求并加密解密。通过[NSURLProtocol registerClass: [NetworkInject class]];注入了自定义的NSURLProtocol类 3、原理:利用NSURLProtocol 拦截 HTTP 请求 基于NSURLProtocol实现iOS应用底层所有网络请求拦截(含网页ajax请求拦截【不支持WKWebView】);HTTP 请求开始时,URL 加载系统创建一个合适的 NSURLProtocol 对象处理对应的 URL 请求,因此我们只需写一个继承自 NSURLProtocol 的类,并通过 - registerClass: 方法注册我们的协议类,然后 URL 加载系统就会在请求发出时使用我们创建的协议对象对该请求进行处理。4、特色功能:4.1http-dns防止DNS劫持。会直接从本地或特定服务器地址进行DNS解析,是一种避免DNS劫持的措施 https://kunnan.blog.csdn.net/article/details/115868333

image.png

4.2 禁止网络代理抓包(开启后使用代理方式抓包的程序无法抓到此App中的请求,且计时处于代理网络下也不会影响App本身的请求)https://kunnan.blog.csdn.net/article/details/115866030

image.png

目录
相关文章
|
8月前
|
缓存 网络协议 UED
深度解析HTTP协议从版本0.9至3.0的演进和特性。
总的来说,HTTP的演进是互联网技术不断发展和需求日益增长的结果。每一次重要更新都旨在优化性能,增进用户体验,适应新的应用场景,而且保证了向后兼容,让互联网的基础架构得以稳定发展。随着网络技术继续进步,我们可以预期HTTP协议在未来还会继续演化。
997 0
|
11月前
|
JSON 安全 网络协议
HTTP/HTTPS协议(请求响应模型、状态码)
本文简要介绍了HTTP与HTTPS协议的基础知识。HTTP是一种无状态的超文本传输协议,基于TCP/IP,常用80端口,通过请求-响应模型实现客户端与服务器间的通信;HTTPS为HTTP的安全版本,基于SSL/TLS加密技术,使用443端口,确保数据传输的安全性。文中还详细描述了HTTP请求方法(如GET、POST)、请求与响应头字段、状态码分类及意义,并对比了两者在请求-响应模型中的安全性差异。
1042 20
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
1146 124
|
安全 API 网络安全
使用OkHttp进行HTTPS请求的Kotlin实现
使用OkHttp进行HTTPS请求的Kotlin实现
|
Web App开发 缓存 网络协议
HTTP3版本和实现验证
这篇文章详细介绍了HTTP3协议及其与HTTP2的比较,解释了HTTP3基于QUIC协议的工作原理,包括0-RTT恢复、H3-29草案等技术细节,并提供了验证网站HTTP3支持和浏览器支持的工具和方法。
1799 1
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
837 3
|
安全 Java 网络安全
RestTemplate进行https请求时适配信任证书
RestTemplate进行https请求时适配信任证书
1221 3
|
安全 网络安全 数据安全/隐私保护
HTTPS 请求中的证书验证详解(Python版)
HTTPS 请求中的证书验证详解(Python版)
1070 0
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
511 5
|
应用服务中间件 网络安全 nginx
docker 搭建 最新版本的 gitlab,使用HTTPS访问,以及gitlab的基础使用讲解
docker 搭建 最新版本的 gitlab,使用HTTPS访问,以及gitlab的基础使用讲解

热门文章

最新文章