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

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品在线91| 国产精品18久久久久久首页狼| 日韩欧美中文字幕在线观看| 日韩在线观看电影| 91精品国产成人www| 日韩高清欧美高清| 国产精品va在线播放| 中文字幕精品影院| 成人性生交大片免费看视频直播| 亚洲日韩第一页| 日韩亚洲综合在线| 成人国产亚洲精品a区天堂华泰| 黑人欧美xxxx| 日韩在线精品一区| 91精品国产高清久久久久久91| www国产精品视频| 国产亚洲日本欧美韩国| 亚洲免费精彩视频| 亚洲国产91精品在线观看| 日韩av日韩在线观看| 久久精品国产亚洲一区二区| 精品女厕一区二区三区| 日本一区二三区好的精华液| 国产午夜精品免费一区二区三区| 国产一区二区激情| 久久视频精品在线| 亚洲视频自拍偷拍| 欧美又大粗又爽又黄大片视频| 一区二区av在线| 日韩精品视频观看| 国产精品美女999| 亚洲电影免费观看高清完整版| 国产精品久在线观看| 国产一区二区色| 亚洲欧美制服中文字幕| 久久久精品影院| 久久精品国产精品亚洲| 日韩免费精品视频| 国产在线精品自拍| 亚洲成人av在线播放| 亚洲欧美日韩直播| 91精品国产综合久久香蕉的用户体验| 91免费综合在线| 黄色精品一区二区| 少妇高潮久久久久久潘金莲| 欧美激情xxxx性bbbb| 久久亚洲精品小早川怜子66| 久久琪琪电影院| 久久亚洲精品一区| 欧美日韩第一页| 国产精品激情av在线播放| 国产91成人在在线播放| 欧美激情a在线| 日本精品免费观看| 国产精品99蜜臀久久不卡二区| 一本色道久久88综合日韩精品| 欧美猛男性生活免费| 欧美激情免费在线| 日韩av在线免费播放| 激情成人在线视频| 97热精品视频官网| 国产精品综合不卡av| 成人网中文字幕| 国产精品美女免费| 在线精品国产欧美| 亚洲情综合五月天| 久久成人18免费网站| 亚洲第一av在线| 精品视频—区二区三区免费| 国产91免费看片| 色综合视频网站| 亚洲人成电影在线播放| 欧美成在线观看| 国产亚洲欧美日韩美女| 亚洲区中文字幕| 国产精品久久一区| 日本aⅴ大伊香蕉精品视频| 自拍偷拍亚洲精品| 欧美激情一区二区三区在线视频观看| 欧美成人性色生活仑片| 国产亚洲a∨片在线观看| 中文字幕亚洲激情| 日韩专区在线播放| 欧美日本精品在线| 欧美亚洲在线视频| 国产精品久久久久久久av电影| 精品久久久久久久久久久| 亚洲国产美女久久久久| 一区二区成人精品| 色偷偷偷亚洲综合网另类| 日韩精品视频三区| 欧美精品午夜视频| 欲色天天网综合久久| 欧美亚洲国产视频| 欧美精品激情blacked18| 欧美视频13p| 欧美黄网免费在线观看| 亚洲韩国日本中文字幕| 九九热最新视频//这里只有精品| 亚洲国产精品va| 18一19gay欧美视频网站| 国产伊人精品在线| 中文字幕日韩欧美精品在线观看| 国产精品激情av在线播放| 国产精品视频久久久久| 在线看国产精品| 在线观看国产精品淫| 国产精品老女人视频| 秋霞午夜一区二区| 亚洲人成免费电影| 91精品久久久久久综合乱菊| 日韩专区中文字幕| 精品动漫一区二区三区| 亚洲综合中文字幕在线观看| 4388成人网| 国产精品成人一区二区三区吃奶| 成人a在线视频| 久久人91精品久久久久久不卡| 国产精品第100页| 亚洲精品国产精品国自产观看浪潮| 夜夜狂射影院欧美极品| 国产精品影院在线观看| 亚洲专区中文字幕| 国产成人一区三区| 97超级碰在线看视频免费在线看| 91网站在线看| 日韩电影中文 亚洲精品乱码| 成人国产在线视频| 伊人精品在线观看| 国产精品国产自产拍高清av水多| 欧美另类交人妖| 中文字幕在线看视频国产欧美| 亚洲尤物视频网| 欧美在线日韩在线| 国产精品一区二区久久国产| 2019中文字幕在线免费观看| 不卡在线观看电视剧完整版| 日韩在线观看网站| 成人黄色午夜影院| 最近的2019中文字幕免费一页| 一区二区亚洲精品国产| 亚洲福利在线视频| 亚洲欧洲日产国产网站| 国产日本欧美在线观看| 欧美性极品少妇精品网站| 欧美在线xxx| 国产精品专区第二| 麻豆国产精品va在线观看不卡| 久久久久久久亚洲精品| 91禁外国网站| 欧美极度另类性三渗透| 日韩中文在线中文网三级| 欧美日韩亚洲一区二区三区| 中文字幕欧美精品日韩中文字幕| 久久国产精彩视频| 久久久久久久久久久免费| 国产日产亚洲精品| 欧美国产视频一区二区| 久久久久久中文字幕| 91国产高清在线| 最近2019年手机中文字幕| 国内揄拍国内精品少妇国语| 国产精品美女免费视频| 国产一区二区三区直播精品电影|