我們知道 ,ios 8.0以後,apple給出了壹個WKWebView來替換 UIWebView,前者比後者在加載速度方面優化了很多,但是也有不少坑點,比如在攔截wkwebView的請求上,apple始終沒有給出明確的API供開發者使用,正常情況下,我們自定義壹個NSURLProtocol類,然後在AppDelegate裏面register壹波,就可以攔截到app內部所有的網絡請求,但是妳會發現,wkwebView並不吃這壹套,what the fuck!,這壹點在網上有人說wkwebView的請求是在單獨的進程裏面,為了性能方面的考慮,所以不走NSURLProtocol,但是通過打斷點會發現,它會走壹下 + (BOOL)canInitWithRequest:(NSURLRequest *)request ,然而這就尷尬了,為啥他會走壹下,然後就壹直不走了呢?於是我開始去研究了壹波技術討論,請教了壹些大牛,找到了解決方案:寫壹個單獨的NSURLProtocol類的分類方法,這裏要提醒壹下:由於這是私有方法,可能導致上線被拒!!!
.h文件:
.m文件:
然後在AppDelegate裏面去註冊壹波scheme,壹般是註冊http和https,然後打壹波斷點妳就會發現,可以攔截了,可以為所欲為了,壹般對wkwebView的攔截的原因壹般是要加壹些特定的請求頭或者攔截廣告(接觸的項目裏面是這樣幹的)
+ (BOOL)canInitWithRequest:(NSURLRequest *)request 在這裏進行過濾判斷,
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request 這裏面可以拿到被攔截的請求,可以在這裏面對這個request進行二次處理,然後在startLoading方法裏面自己進行自定義的處理!