国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS NSURLProtocol的具體使用方法詳解

2019-10-21 18:43:47
字體:
來源:轉載
供稿:網友

本文介紹了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"//在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

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


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开封县| 牡丹江市| 澎湖县| 霍山县| 诏安县| 富平县| 招远市| 惠水县| 克山县| 岱山县| 芮城县| 广灵县| 瓦房店市| 长岛县| 弥渡县| 葫芦岛市| 新龙县| 光山县| 清水河县| 巴马| 广水市| 邢台市| 扶沟县| 麻栗坡县| 莲花县| 大竹县| 蕲春县| 乐山市| 合阳县| 邛崃市| 卓资县| 云霄县| 齐齐哈尔市| 筠连县| 漳州市| 当雄县| 南涧| 阳东县| 英超| 克山县| 乐平市|