亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS NSURLProtocol的具體使用方法詳解

2020-07-26 02:37:36
字體:
來源:轉載
供稿:網友

本文介紹了iOS NSURLProtocol的具體使用方法詳解,分享給大家,具體如下:

NSURLProtocol定義

這兩天在優化項目,無意間看到了NSURLProtocol,學習一下順便總結下來。

NSURLProtocol也是蘋果眾多黑魔法中的一種,能夠讓你去重新定義蘋果的URL加載系統 (URL Loading System)的行為,URL Loading System里有許多類用于處理URL請求,比如NSURL,NSURLRequest,NSURLConnection和NSURLSession等,當URL Loading System使用NSURLRequest去獲取資源的時候,它會創建一個NSURLProtocol子類的實例,NSURLProtocol看起來像是一個協議,但其實這是一個類,而且必須使用該類的子類,并且需要被注冊。

NSURLProtocol使用范圍

只要是使用NSURLConnection或者 NSURLSession實現的,你都可以通過NSURLProtocol做一些自定義的操作。

1、自定義請求和響應

2、網絡的緩存處理(H5離線包 和 網絡圖片緩存)

3、重定向網絡請求

4、為測試提供數據Mocking功能,在沒有網絡的情況下使用本地數據返回。

5、過濾掉一些非法請求

6、快速進行測試環境的切換

7、攔截圖片加載請求,轉為從本地文件加載

8、可以攔截UIWebView,基于系統的NSURLConnection或者NSURLSession進行封裝的網絡請求。目前WKWebView無法被NSURLProtocol攔截。

9、當有多個自定義NSURLProtocol注冊到系統中的話,會按照他們注冊的反向順序依次調用URL加載流程。當其中有一個NSURLProtocol攔截到請求的話,后續的NSURLProtocol就無法攔截到該請求。

NSURLProtocol自定義

#import <Foundation/Foundation.h> @interface CustomURLProtocol : NSURLProtocol @end

要實現下面的方法

+ canInitWithRequest: //抽象方法,子類給出是否能相應該請求。如果響應YES,說明自己的CustomURLProtocol實現該請求。 + canonicalRequestForRequest://抽象方法,重寫該方法,可以對請求進行修改,例如添加新的頭部信息,修改,修改url等,返回修改后的請求。 + requestIsCacheEquivalent:toRequest://看都是緩存了 - startLoading://開始下載,需要在該方法中發起一個請求,對于NSURLConnection來說,就是創建一個NSURLConnection,對于NSURLSession,就是發起一個NSURLSessionTask 。一般下載前需要設置該請求正在進行下載,防止多次下載的情況發生 - stopLoading://停止相應請求,清空請求Connection 或 Task

使用自定義NSURLProtocol類

1.在單個的UIViewController中使用

//導入自定義NSURLProtocol類#import "CustomURLProtocol.h"http://在ViewDidLoad中添加攔截網絡請求的代碼//注冊網絡請求攔截[NSURLProtocol registerClass:[CustomURLProtocol class]];//在ViewWillDisappear中添加取消網絡攔截的代碼//取消注冊網絡請求攔截[NSURLProtocol unregisterClass:[CustomURLProtocol class]];

2.攔截整個App中所有的網絡請求

//直接在AppDelegate中的didFinishLaunchingWithOptions注冊網絡攔截代碼//注冊Protocol[NSURLProtocol registerClass:[CustomURLProtocol class]];NSURLProtocol使用實例#define URLProtocolHandledKey @"URLProtocolHandledKey" + (BOOL)canInitWithRequest:(NSURLRequest *)request{ //只處理http和https請求  NSString *scheme = [[request URL] scheme];  if ( ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame ||   [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame)){    //看看是否已經處理過了,防止無限循環    if ([NSURLProtocol propertyForKey:URLProtocolHandledKey inRequest:request]) {      return NO;    }    return YES;  }  return NO;} + (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request {   /** 可以在此處添加頭等信息 */  NSMutableURLRequest *mutableReqeust = [request mutableCopy];  mutableReqeust = [self redirectHostInRequset:mutableReqeust];  return mutableReqeust;} +(NSMutableURLRequest*)redirectHostInRequset:(NSMutableURLRequest*)request{  if ([request.URL host].length == 0) {    return request;  }   NSString *originUrlString = [request.URL absoluteString];  NSString *originHostString = [request.URL host];  NSRange hostRange = [originUrlString rangeOfString:originHostString];  if (hostRange.location == NSNotFound) {    return request;  }  //定向薄荷喵到主頁  NSString *ip = @"bohemiao.com";   // 替換域名  NSString *urlString = [originUrlString stringByReplacingCharactersInRange:hostRange withString:ip];  NSURL *url = [NSURL URLWithString:urlString];  request.URL = url;   return request;} + (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b{  return [super requestIsCacheEquivalent:a toRequest:b];} - (void)startLoading{  NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];  //標示該request已經處理過了,防止無限循環  [NSURLProtocol setProperty:@YES forKey:URLProtocolHandledKey inRequest:mutableReqeust];  self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];  //使用NSURLSession也是一樣的} - (void)stopLoading{  [self.connection cancel];} - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {  [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];} - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {  [self.client URLProtocol:self didLoadData:data];} - (void) connectionDidFinishLoading:(NSURLConnection *)connection {  [self.client URLProtocolDidFinishLoading:self];} - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {  [self.client URLProtocol:self didFailWithError:error];}

上面用到的一些NSURLProtocolClient方法

@protocol NSURLProtocolClient <NSObject> //請求重定向- (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse; // 響應緩存是否合法- (void)URLProtocol:(NSURLProtocol *)protocol cachedResponseIsValid:(NSCachedURLResponse *)cachedResponse; //剛接收到Response信息- (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy; //數據加載成功- (void)URLProtocol:(NSURLProtocol *)protocol didLoadData:(NSData *)data; //數據完成加載- (void)URLProtocolDidFinishLoading:(NSURLProtocol *)protocol; //數據加載失敗- (void)URLProtocol:(NSURLProtocol *)protocol didFailWithError:(NSError *)error; //為指定的請求啟動驗證- (void)URLProtocol:(NSURLProtocol *)protocol didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; //為指定的請求取消驗證- (void)URLProtocol:(NSURLProtocol *)protocol didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; @end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大人香蕉在线| 亚洲精品福利免费在线观看| 欧美性xxxx| 色偷偷av一区二区三区| 日韩精品福利网站| 日本成人免费在线| 亚洲欧美日韩视频一区| 欧美午夜精品久久久久久浪潮| 欧美性生活大片免费观看网址| 日韩欧美国产高清91| 日韩黄色av网站| 亚洲国产欧美在线成人app| 国产精品扒开腿爽爽爽视频| 国产欧美精品va在线观看| 欧美交受高潮1| 亚洲性xxxx| 国产精品福利小视频| 亚洲一区中文字幕在线观看| 日韩在线视频一区| 日韩在线高清视频| 欧美日韩美女视频| 免费91麻豆精品国产自产在线观看| 欧美专区国产专区| 欧美日韩成人精品| 成人激情在线观看| 久久五月情影视| 97精品一区二区三区| www国产亚洲精品久久网站| 国产性色av一区二区| 日韩成人性视频| 中日韩美女免费视频网站在线观看| 国产成人亚洲精品| 欧美精品成人91久久久久久久| 亚洲网站在线观看| 97香蕉久久超级碰碰高清版| 91亚洲国产成人精品性色| 欧洲成人免费视频| 国产一区二区在线免费| 九九久久久久久久久激情| 日本伊人精品一区二区三区介绍| 91在线网站视频| 国产丝袜一区二区三区免费视频| 亚洲综合一区二区不卡| 欧美精品videos另类日本| 日韩av电影院| 成人美女av在线直播| 国产精品99久久久久久白浆小说| 精品久久久久久久久久国产| 中文在线资源观看视频网站免费不卡| 日韩国产高清污视频在线观看| 性色av一区二区三区免费| 亚洲国产日韩欧美综合久久| 亚洲精品视频在线观看视频| 日韩欧美国产骚| 国产福利精品av综合导导航| 国产91在线播放九色快色| 97视频色精品| 亚洲韩国日本中文字幕| 亚洲欧美制服另类日韩| 97色在线观看免费视频| 亚洲丝袜一区在线| 亚洲精品97久久| y97精品国产97久久久久久| 成人在线国产精品| 日韩欧美aⅴ综合网站发布| 日韩电影在线观看中文字幕| 国产精品欧美在线| 亚洲国产中文字幕久久网| 国产福利成人在线| 国产成人精品综合久久久| 亚洲成年人影院在线| 亚洲成人黄色网址| 日韩av免费在线| 色诱女教师一区二区三区| 日韩精品免费综合视频在线播放| 亚州成人av在线| 久久精品2019中文字幕| 日韩av资源在线播放| 国产欧美日韩精品丝袜高跟鞋| 亚洲精品国产电影| 国产精品黄色影片导航在线观看| 中文字幕在线观看亚洲| 国产精品入口夜色视频大尺度| 国产精品久久久久国产a级| 亚洲一区二区三区成人在线视频精品| 久久综合九色九九| 久久伊人91精品综合网站| 日韩免费av片在线观看| 日韩av成人在线| 欧美一性一乱一交一视频| 久久影视电视剧免费网站清宫辞电视| 精品高清一区二区三区| 欧美专区在线观看| 亚洲最大在线视频| 亚洲激情第一页| 国产精品精品久久久| 中文字幕亚洲欧美日韩2019| 亚洲999一在线观看www| 亚洲欧美日本另类| 国产精品日韩久久久久| 久久国产精品视频| 色琪琪综合男人的天堂aⅴ视频| 精品久久香蕉国产线看观看gif| 欧美高清视频在线观看| 亚洲欧美一区二区三区情侣bbw| 久久亚洲欧美日韩精品专区| 国产婷婷97碰碰久久人人蜜臀| 欧美国产日韩中文字幕在线| 国产国产精品人在线视| 日韩高清电影免费观看完整版| 亚洲第一网站免费视频| 一本一本久久a久久精品牛牛影视| 日韩高清av一区二区三区| 精品福利一区二区| 亚洲国产天堂久久综合网| 欧美日韩亚洲网| 日韩av在线最新| 国产激情久久久| 成人深夜直播免费观看| 欧美自拍视频在线| 国产又爽又黄的激情精品视频| 日韩精品久久久久| 91视频国产高清| 欧美亚洲伦理www| 欧美精品成人在线| 欧美激情免费观看| 成人网址在线观看| 97婷婷涩涩精品一区| 992tv成人免费影院| 日韩欧美中文字幕在线播放| 97视频在线观看免费高清完整版在线观看| 欧美大尺度在线观看| 日本亚洲欧美成人| 国产在线精品一区免费香蕉| 亚洲精品久久久久中文字幕二区| www.xxxx精品| 成人黄色av网站| 日韩在线免费av| 亚洲精品小视频在线观看| 久久九九热免费视频| 亚洲欧美另类自拍| 欧美日韩亚洲精品一区二区三区| 国产一区二区在线免费视频| 国产精品美腿一区在线看| 欧美激情a∨在线视频播放| 亚洲美女动态图120秒| 亚洲国产日韩欧美在线图片| 欧美激情videoshd| 成人综合国产精品| 国产自摸综合网| 国产一区二区三区在线观看视频| 色偷偷偷综合中文字幕;dd| 久久久av亚洲男天堂| 亚洲精品网址在线观看| 国产精品久久久久久久av大片| 青青在线视频一区二区三区| 久久久久久久国产精品视频| 日韩电影中文 亚洲精品乱码| 在线成人激情黄色| 在线视频欧美性高潮| 国产成一区二区| 日韩一二三在线视频播| 中文字幕亚洲天堂| 国产精品一二三在线|