iOS 网络请求劫持
1、概述:
NSURLProtocol是URL loading system 中的一个重要的组成部分,它允许我们对全局的网络请求(基于使用URLRequest)做拦截,可拦截的请求类型有NSURLConnection、NSURLSession 和 UIWebView中的请求。对于WKWebView的请求,它是无能为力的。
成功拦截网络请求后,有且不局限于如下:
忽略网络请求,直接返回自定义的Response
修改request(请求地址,认证信息等等)
为了测试对HTTP返回内容进行mock和stub
创建本地代理服务,用于数据变化时对URL请求的更改
故意制造畸形或非法返回数据来测试程序的鲁棒性
过滤请求和返回中的敏感信息
在既有协议基础上完成对 NSURLConnection 的实现且与原逻辑不产生矛盾
2、实现
2.1需要从URLProtocol派生自己的协议类,那么必须重写以下四个方法
@objc class CustomURLProtocol: URLProtocol {override class func canInit(with:URLRequest) -> Bool { // 是否拦截请求,再做处理if let url = with.url {if with.url!.host == "your host" {return true}}return false}override class func canonicalRequest(for: URLRequest) ->URLRequest {return `for`}override func startLoading() {self.stopLoading()}override func stopLoading() {self.client?.urlProtocolDidFinishLoading(self)}override class func requestIsCacheEquivalent(_ a: URLRequest, to b: URLRequest) -> Bool {return true}
}
2.2再使用NSURLConnection或NSURLSession结合client对象处理该请求,使用client对象,将请求相关的结果返回URL loading system
以URLConnection为例:
func connection(_ connection: NSURLConnection, didFailWithError error: Error) {self.client?.urlProtocol(self, didFailWithError: error)}func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {self.client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)}func connection(_ connection: NSURLConnection, didReceive data: Data) {self.client?.urlProtocol(self, didLoad: data)}func connectionDidFinishLoading(_ connection: NSURLConnection) {self.client?.urlProtocolDidFinishLoading(self)}
3、注册自定义的协议名
如果你使用的是OC,可以在自定义类中的重写+load()
+ (void)load {dispatch_async(dispatch_get_global_queue(0, 0), ^{[NSURLProtocol registerClass:self];});
}
如果你使用的是Swift,需要在app进行网络请求之前完成注册:
URLProtocol.registerClass(CustomURLProtocol.classForCoder())
详细的Demo可以参照:
NSURLProtocol的用法
iOS 网络请求劫持相关推荐
- 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合
自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...
- 最简单的iOS网络请求
为什么80%的码农都做不了架构师?>>> 做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大易用的确很好. 但是 ...
- iOS网络请求安全(JWT,RSA)
在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光.当然,你可能会采用加密算法来加密数据,但是这仍然不够. 在移动端和服务器的通信 ...
- iOS网络请求安全认证(JWT,RSA)
在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光.当然,你可能会采用加密算法来加密数据,但是这仍然不够. 在移动端和服务器的通信 ...
- iOS网络请求认证挑战
一.引言 Http请求中认证挑战相关的代理如下: 1.将要发送一个认证挑战的请求 - connection:willSendRequestForAuthenticationChallenge: 2.是 ...
- iOS网络请求错误nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004
在发起一个网络请求时,出现错误 nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004 ...
- ios开发循环网络请求_GitHub - JadenTeng/ResourceX: iOS网络请求,网络泛型编程,工具类的封装,基于AFNetworking 实现, NSCache数据缓存...
ResourceX 通过AFNetworking.YYModel 解析网络泛型编程简化网络请求 现如今,网络通信几乎涉及每一个app程序.对于绝大多数请求HTTP API的方法,它们的执行流程都可以分 ...
- iOS ---网络请求封装(自动缓存与手动缓存)
#import <Foundation/Foundation.h> @interface WNetworkCache : NSObject /** * 手动写入/更新缓存 * * @p ...
- php后台和ios网络请求,iOS网络 POST通过JSON传数据到后台
后台php脚本代码 header('Content-Type:text/plain;charset=utf-8'); $json = file_get_contents('php://input'); ...
最新文章
- 【重磅上线】思维导图工具XMind:ZEN基础问题详解合集
- 事务管理最佳实践多余的话之一“每次请求,一次数据库连接,一次事务”是不是金科玉律?...
- DB-Engines 2018:PostgreSQL 蝉联“年度数据库”称号
- Navigation bar - remove recent object
- django请求生命周期
- Android LBS系列06 位置策略(二)模拟位置数据的方法
- idea 代码格式化 无效
- 属性编辑器PropertyEditor
- LF-YOLO: A Lighter and Faster YOLO for Weld Defect Detection of X-ray Image
- 面试经历---网易(2016年01月19日下午面试)
- 20155314 2016-2017-2 《Java程序设计》第4周学习总结
- SQL SERVER 读取数据库中所有表名
- 清北学堂学习笔记 第一期
- html表单验证方法,简述HTML交互式表单验证方法
- 知识付费——移动端音视频加密、防盗播实现方案
- 炒股狂人的悲惨经历 从120万炒到10万
- raspberry pi_许多Raspberry Pi项目-您怎么不爱小型计算机?
- 06-图1 列出连通集 —— 非联通图的DFS与BFS
- 使用FastAPI重写Django官网Polls教程
- 计算机一体化教学考核办法,谈计算机一体化教学.pdf
热门文章
- 基于墨刀实现的原型系统:一款简易的读书软件
- 【Unity】Kinect屏幕显示环境背景及人体投影
- 文件已经删除,但是空间没有释放的异常
- 实现简单的校园网自动登录
- Dynamic CRM9.0 环境安装部署手册步骤和遇到的一些问题解决方案(包含ADFS部署)
- 【毕业设计/matlab系列】基于Matlab的立体视觉匹配算法实现【含Matlab源码】
- linux的./configure --prefix的作用
- shell脚本中实现远程和其他用户的子shell执行
- Flink SQL Print Connector
- 【Scratch-文字朗读模块】Scratch-文字朗读模块分析——人工智能的基础