NSURLProtocol的学习总结
一、基础篇
1.是什么
- NSURLProtocol是iOS中URL处理系统中鲜为人知的核心
- 首先在深入研究之前,需要对网络概念有一个基本的了解,并熟悉
NSURLConnection
的工作原理。 如果您目前不熟悉NSURLConnection,那么我建议您阅读Apple的本教程和/或NSURLConnection。 - 有一组类被称为URL Loading System,需要了解它们以了解iOS如何处理应用程序基于URL的资源的加载请求。
- URL Loading System 的核心类是 NSURL,对于一个网络请求,NSURL 类告诉我们,我们的APP请求的host是什么,请求的资源在host中的path是什么;另外,NSURLRequest对象增加HTTP Header、请求的body等信息;URL Loading System 提供了几个不同的类来处理request,最常见的是 NSURLConnection 和 NSURLSession;
- 接收到响应时,响应会分为两部分,metaData 和 Data;其中metaData 会被封装进 NSURLResponse 对象中,它会告诉我们MIME 类型(什么是MIME type)、文本编码格式、the expected amount of data of your response 以及作为数据来源的URL;Data 以 NSData对象的方式返回。
- 在后台,当URL Loading System 通过 NSURLRequest 加载数据时,它将会创建一个 NSURLProtocol 的子类的实例对象。NSURLProtocol是一个抽象类,我们不能直接实例化它
请记住,Objective-C实际上并没有抽象类作为一等公民。 只有通过定义和文档,类才被标记为抽象。
- 鉴于 NSURLProtocol的命名,很容易被误解为是一个协议,但其实它是一个类。但它的使用方式跟协议很像,因为它定义了一系列继承自NSURLProtocol必须实现的方法。对苹果来说,协议可能不够灵活,所以他们选择了抽象基类。
2.为什么有?怎么用?
- NSURLProtocol该如何使用才能让我们的APP更强大呢?
2.1 为网络请求提供自定义的响应
- 不论是使用什么发起的网络请求,比如UIWebView、NSURLConnection甚至一些第三方的库,你都可以提供给这个请求一个自定义的响应体,包括 metaData 和 Data。当你想要删除掉 请求的响应用于测试时就可以使用NSURLProtocol。或者让请求加载本地的已经存在的自定义资源也可以使用这。
2.2 跳过网络活动,提供本地数据
- 有时您可能认为没有必要触发网络请求来为应用程序提供所需的任何数据。 NSURLProtocol可以将您的应用程序设置为在本地存储或本地数据库中查找数据。
2.3重定向您的网络请求
- 您是否想过能够重新定向网络请求到一个代理服务器,并且不需要为了取得用户的信任而遵循特定的iOS设置说明? NSURLProtocol就提供了控制请求的能力。您可以设置您的app拦截请求并重定向至另一个代理服务器或其他任何你想定向到的地方
2.4 修改请求的user-agent
- 在触发任何网络请求之前,您可以决定更改其metadata或data。 例如,您可能想要更改user-agent。 如果您的服务器根据user-agent返回不同的内容,这可能很有用。 这方面的一个例子是手机和笔记本返回的内容之间的差异。
2.5 使用您自己的网络请求协议
- 您获取会有自己的网络协议(比如,基于UDP实现的)。你可以在APP中实现它,你仍然可以使用你喜欢的网络库
不用说,可能性有超级多中,在这里列出所有使用NSURLProtocol的可能性很不切实际(并非不可能)。
虽然 NSURLProtocol非常强大,但要记住它不是网络库。它是一个工具,当你已经使用了网络库以后仍然可以使用它。简而言之,您可以在使用自己的库时充分利用NSURLProtocol的优势
二、碎碎念
1.
默认情况下,iOS URL加载系统支持以下方案:
ftp://用于文件传输协议
http://用于超文本传输协议
https://用于加密的超文本传输协议
file://用于本地文件URL
data://用于数据URL
三、自定义URL Loading
- 没有用户喜欢一个永远在加载的页面。 所以现在你需要确保你的应用程序能够真的在处理请求。 只要在+ canInitWithRequest:方法中返回YES,就完全由您的类负责处理有关该请求的所有内容。 这意味着您需要获取所请求的数据并将其提供回URL加载系统。
- 该怎样去获取所请求的数据呢