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 网络请求劫持相关推荐

  1. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  2. 最简单的iOS网络请求

    为什么80%的码农都做不了架构师?>>>    做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大易用的确很好. 但是 ...

  3. iOS网络请求安全(JWT,RSA)

    在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光.当然,你可能会采用加密算法来加密数据,但是这仍然不够. 在移动端和服务器的通信 ...

  4. iOS网络请求安全认证(JWT,RSA)

    在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光.当然,你可能会采用加密算法来加密数据,但是这仍然不够. 在移动端和服务器的通信 ...

  5. iOS网络请求认证挑战

    一.引言 Http请求中认证挑战相关的代理如下: 1.将要发送一个认证挑战的请求 - connection:willSendRequestForAuthenticationChallenge: 2.是 ...

  6. iOS网络请求错误nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004

    在发起一个网络请求时,出现错误 nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004 ...

  7. ios开发循环网络请求_GitHub - JadenTeng/ResourceX: iOS网络请求,网络泛型编程,工具类的封装,基于AFNetworking 实现, NSCache数据缓存...

    ResourceX 通过AFNetworking.YYModel 解析网络泛型编程简化网络请求 现如今,网络通信几乎涉及每一个app程序.对于绝大多数请求HTTP API的方法,它们的执行流程都可以分 ...

  8. iOS ---网络请求封装(自动缓存与手动缓存)

    #import <Foundation/Foundation.h> @interface WNetworkCache : NSObject /** *  手动写入/更新缓存 * *  @p ...

  9. php后台和ios网络请求,iOS网络 POST通过JSON传数据到后台

    后台php脚本代码 header('Content-Type:text/plain;charset=utf-8'); $json = file_get_contents('php://input'); ...

最新文章

  1. 【重磅上线】思维导图工具XMind:ZEN基础问题详解合集
  2. 事务管理最佳实践多余的话之一“每次请求,一次数据库连接,一次事务”是不是金科玉律?...
  3. DB-Engines 2018:PostgreSQL 蝉联“年度数据库”称号
  4. Navigation bar - remove recent object
  5. django请求生命周期
  6. Android LBS系列06 位置策略(二)模拟位置数据的方法
  7. idea 代码格式化 无效
  8. 属性编辑器PropertyEditor
  9. LF-YOLO: A Lighter and Faster YOLO for Weld Defect Detection of X-ray Image
  10. 面试经历---网易(2016年01月19日下午面试)
  11. 20155314 2016-2017-2 《Java程序设计》第4周学习总结
  12. SQL SERVER 读取数据库中所有表名
  13. 清北学堂学习笔记 第一期
  14. html表单验证方法,简述HTML交互式表单验证方法
  15. 知识付费——移动端音视频加密、防盗播实现方案
  16. 炒股狂人的悲惨经历 从120万炒到10万
  17. raspberry pi_许多Raspberry Pi项目-您怎么不爱小型计算机?
  18. 06-图1 列出连通集 —— 非联通图的DFS与BFS
  19. 使用FastAPI重写Django官网Polls教程
  20. 计算机一体化教学考核办法,谈计算机一体化教学.pdf

热门文章

  1. 基于墨刀实现的原型系统:一款简易的读书软件
  2. 【Unity】Kinect屏幕显示环境背景及人体投影
  3. 文件已经删除,但是空间没有释放的异常
  4. 实现简单的校园网自动登录
  5. Dynamic CRM9.0 环境安装部署手册步骤和遇到的一些问题解决方案(包含ADFS部署)
  6. 【毕业设计/matlab系列】基于Matlab的立体视觉匹配算法实现【含Matlab源码】
  7. linux的./configure --prefix的作用
  8. shell脚本中实现远程和其他用户的子shell执行
  9. Flink SQL Print Connector
  10. 【Scratch-文字朗读模块】Scratch-文字朗读模块分析——人工智能的基础