? ? 需求的輪子一直在滾動。你上車了沒?曾有沒發(fā)現(xiàn) Charles 抓取其它 APP 時候,有些數(shù)據(jù)是無法獲取到的?會想到它們是怎么做到的嗎?
? ? NSURLProtocol?也是蘋果眾多黑魔法中的一種,使用它可以輕松地重定義整個URL Loading System。
? ? NSURLProtocol?是蘋果為我們提供的?URL Loading System?一部分,先了解下它在整體中的位置。
? ? 從圖中我們可以知道,NSURLProtocol 可攔截的網(wǎng)絡(luò)請求包括NSURLSession,NSURLConnection 的以及 UIWebView 中。而基于 CFNetwork 的網(wǎng)絡(luò)請求,以及在WKWebView 中,只能攔截到最初始的請求,內(nèi)嵌的資源下載攔截不到。不過本文 Tips 中提供了有效的方法。
? ??Mattt?撰寫的?NSURLProtocol?文章中,有張圖更清晰的描述了?URL Loading System,下面的?URL 加載系統(tǒng)的圖片?版本有點久遠,還沒有把 NSURLSession 放進來。
? ? 那具體些,NSURLProtocol 能處理些什么問題呢?當你注冊自定義 NSURLProtocol 后,就有機會對所有的請求進行統(tǒng)一的處理,基于這一點它可以讓你:
1.自定義網(wǎng)絡(luò)請求和響應(yīng)結(jié)果
?2.提供自定義的全局緩存支持|實現(xiàn)網(wǎng)絡(luò)緩存。
?3.重定向網(wǎng)絡(luò)請求,實現(xiàn)代理等功能。
?4.對 HTTP 返回內(nèi)容進行Mocking?和Stub?(方便前期測試) 。
?5.全局設(shè)置網(wǎng)絡(luò)請求。
如何使用
? ? 要使用 NSURLProtocol 時你是不能直接實例化 NSURLProtocol 的因為這是一個抽象類只提供基本的功能和屬性,你只能子類化 NSURLProtocol 。
創(chuàng)建分類繼承。
當NSURLConnection準備發(fā)起請求時,它會遍歷所有已注冊的NSURLProtocol,詢問它們能否處理當前請求。所以你需要盡早注冊這個Protocol。
Tip:
? ? 1、目前 WKWebView 無法被 NSURLProtocol 直接攔截,還得用本身的代理。若要支持,那可以參考?Wasteland 的深度好文 -?讓 WKWebView 支持 NSURLProtocol。
參考鏈接:
官方文檔:https://developer.apple.com/documentation/foundation/nsurlprotocol