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

首頁 > 系統 > iOS > 正文

詳解如何攔截iOS所有網絡請求

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

背景

最近在研究iOS無埋點統計技術,我們的統計SDK主要分兩部分:點擊事件和網絡請求。統計所有的點擊事件是采用Method Swizzling實現的,可以做到使用中不需要一行代碼實現統計所有事件,具體細節將來我會專門抽幾篇文章介紹。

今天主要說說如何統計APP中的所有網絡請求。公司網絡請求如果不是靜態庫或者框架,很容易想到在網絡請求發送和返回時添加統計的代碼。如何在不修改原來代碼(或者修改最少)的基礎上攔截所有的請求呢,能不能從系統層面上攔截回調呢?答案是肯定的,蘋果有一個黑魔法NSURLProtocol。

介紹

NSURLProtocol是iOS URL Loading System中的一部分,看起來像是一個協議,但其實這是一個類,而且必須使用該類的子類,并且需要被注冊。先看看他在URL Loading System中的位置:

攔截,iOS,網絡請求

使用場景

不管是UIWebView還是URLSession還是第三方的AFNetWorkong、Alamofire或者SDWebImage他們都是基于URLSession或者NSURLConnection來實現的,因此可以通過NSURLProtocol做自定義操作。

  1. 重定向網絡請求
  2. 攔截網絡加載,采用本地緩存
  3. 修改Request信息
  4. 自定義返回結果
  5. 對請求進行HTTPDNS解析,動態設置Host,解決不同網絡下客戶端不能訪問的情況

實現

首先要繼承NSURLProtocol創建自定義的類,然后重寫startLoading、stopLoading添加我們的統計代碼就可以了:

static NSString * const hasInitKey = @"LLMarkerProtocolKey";@interface LLMarkerURLProtocol : NSURLProtocol@end

子類實現的NSURLProtocol方法:

1.0 +(BOOL)canInitWithRequest:(NSURLRequest *)request;子類是否能響應該請求。

+(BOOL)canInitWithRequest:(NSURLRequest *)request{ if ([NSURLProtocol propertyForKey:hasInitKey inRequest:request]) {  return NO; } return YES;}

2.0  +(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request;自定義網絡請求,如果不需要處理直接返回request。

+(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request{ return request;}

3.0  -(void)startLoading 開始網絡請求,需要在該方法中發起一個請求,對于NSURLConnection來說,就是創建一個NSURLConnection,對于NSURLSession,就是發起一個NSURLSessionTask 。一般下載前需要設置該請求正在進行下載,防止多次下載的情況發生。

-(void)startLoading{ NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy]; //做下標記,防止遞歸調用 [NSURLProtocol setProperty:@YES forKey:hasInitKey inRequest:mutableReqeust]; self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];}

4.0  -(void)stopLoading 停止相應請求,清空請求Connection 或Task。

-(void)stopLoading{ [self.connection cancel];}

5.0 實現NSURLConnectionDelegateNSURLConnectionDataDelegate或者NSURLSessionTaskDelegate。

#pragma mark - NSURLConnectionDelegate-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ [self.client URLProtocol:self didFailWithError:error];}#pragma mark - NSURLConnectionDataDelegate- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ self.responseData = [[NSMutableData alloc] init]; [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];}- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.responseData appendData:data]; [self.client URLProtocol:self didLoadData:data];}- (void)connectionDidFinishLoading:(NSURLConnection *)connection { [self.client URLProtocolDidFinishLoading:self];}

使用

一、在AppDelegate中注冊:

[NSURLProtocol registerClass:[LLMarkerURLProtocol class]];

這樣能攔截UIWebView和自定義的請求了,如果要攔截AFNetWorking、Alamofire等第三方請求還需要做一些修改。

二、LLMarkerURLProtocol中添加自定義NSURLSessionConfiguration方法:

+ (NSURLSessionConfiguration *) defaultSessionConfiguration{ NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; NSMutableArray *array = [[config protocolClasses] mutableCopy]; [array insertObject:[self class] atIndex:0]; config.protocolClasses = array; return config;}

攔截第三方網絡庫方法就是讓第三方使用我們這個NSURLSessionConfiguration。因為我們在自己的NSURLSessionConfiguration 中的protocolClasses中注冊了自己類。

三、 下面以Alamofire為例

1.0 繼承Alamofire.SessionManager 自定義SessionManager

class LLSessionManger: Alamofire.SessionManager{ public static let sharedManager: SessionManager = {  let configuration = LLMarkerURLProtocol.defaultSessionConfiguration()  configuration?.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders  let manager = Alamofire.SessionManager(configuration: configuration!)  return manager }()}

2.0 使用 LLSessionManger進行網絡請求

let manager = LLSessionManger.sharedManagermanager.request("https://httpbin.org/get").responseJSON { (response) in if let JSON = response.result.value {  print("JSON: /(JSON)") }}

注意:AFNetWorking、SDWebimage等第三方庫的修改和Alamofire類似,找到使用NSURLSessionConfiguration的地方,換成LLMarkerURLProtocol的defaultSessionConfiguration就可以了。

看到這你可能發現,如果使用Alamofire進行網絡請求,我們還是修改了原來的代碼,下篇文章單獨介紹如何不修改原來代碼,通過注冊Alamofire通知方式,攔截Alamofire的網絡請求。

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


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
视频一区视频二区国产精品| 亚洲精品久久久久久下一站| 亚洲国产精品高清久久久| 欧美片一区二区三区| 成人黄色网免费| 久久成人精品电影| 久久久久久久国产精品| 亚洲精品99久久久久中文字幕| 欧美国产乱视频| 色噜噜国产精品视频一区二区| 成人国产精品色哟哟| 91国自产精品中文字幕亚洲| www.国产精品一二区| 亚洲国产成人精品久久久国产成人一区| 在线观看国产精品91| 久久网福利资源网站| 欧美午夜精品久久久久久久| 一夜七次郎国产精品亚洲| 成人性生交大片免费观看嘿嘿视频| 久久久av亚洲男天堂| 久久噜噜噜精品国产亚洲综合| 国产精品国语对白| 亚洲国产第一页| 久久婷婷国产麻豆91天堂| 久久成人综合视频| 久久久精品视频成人| 777国产偷窥盗摄精品视频| 日韩欧美在线视频日韩欧美在线视频| 日韩一二三在线视频播| 久久久久久高潮国产精品视| 亚洲欧美精品在线| 亚洲国产精品久久久久秋霞蜜臀| 国产精品高清免费在线观看| 欧美性xxxxxx| 91精品国产乱码久久久久久久久| 97成人精品视频在线观看| 亚洲精品美女久久| 欧美视频精品一区| 高潮白浆女日韩av免费看| 91天堂在线观看| 亚洲综合中文字幕在线观看| 粗暴蹂躏中文一区二区三区| 欧美成人免费在线视频| 亚洲第一区第一页| 九九视频这里只有精品| 97国产一区二区精品久久呦| 国产三级精品网站| 精品国产一区二区三区久久狼5月| 亚洲综合色激情五月| www.99久久热国产日韩欧美.com| 成人女保姆的销魂服务| 国产精品一区久久久| 伊人久久男人天堂| 91精品国产91久久久久久久久| 国产成人福利夜色影视| 欧美午夜激情在线| 91久久夜色精品国产网站| 亚洲成人在线视频播放| 成人黄色av免费在线观看| 亚洲va码欧洲m码| 日韩精品中文字幕有码专区| 色综合久久精品亚洲国产| 亚洲跨种族黑人xxx| 欧美一区二区三区免费观看| 欧美福利视频网站| 91日本在线观看| 国语自产精品视频在线看| 91高清免费视频| 欧美国产日产韩国视频| 日韩成人在线网站| 亚洲午夜未满十八勿入免费观看全集| 日韩黄在线观看| 国产免费一区二区三区在线观看| 亚洲福利视频久久| 55夜色66夜色国产精品视频| 国产精品天天狠天天看| 欧美日韩一区二区三区| 中文字幕久久精品| 成人av色在线观看| 国产精品视频xxxx| 国产在线不卡精品| 蜜月aⅴ免费一区二区三区| 国产一区二区三区中文| 国产不卡av在线免费观看| 日韩免费高清在线观看| 欧美激情a在线| 国产精品三级网站| 国产精品青草久久久久福利99| 日韩激情视频在线| 在线视频一区二区| 5278欧美一区二区三区| 欧美日韩国产va另类| 成人激情av在线| 久久躁日日躁aaaaxxxx| 日韩av中文在线| 正在播放国产一区| 日韩精品在线观| 国产精品久久久久av免费| 日韩美女视频在线观看| 黄色一区二区在线观看| 国产中文字幕91| 日韩中文字幕视频在线| 中文字幕亚洲精品| 久久精品国产2020观看福利| 国产欧美日韩视频| 91牛牛免费视频| 久久精品亚洲国产| 91精品免费久久久久久久久| 日韩av手机在线看| 日韩欧美在线观看视频| 亚洲人成电影在线播放| 日韩视频在线免费观看| 精品国产91久久久久久老师| 欧美激情一级二级| 亚洲一区二区在线播放| 亚洲一区中文字幕在线观看| 有码中文亚洲精品| 国产精品久久久久久久久久久久久久| 亚洲奶大毛多的老太婆| 欧美日韩中文在线| 91精品91久久久久久| 欧美激情一区二区三区高清视频| 国产精品成久久久久三级| 亚洲色图第一页| 国产精品网址在线| 欧美日韩午夜视频在线观看| 欧美成人精品xxx| 精品国产1区2区| 亚洲欧美日韩直播| 日本高清+成人网在线观看| 欧美一区二粉嫩精品国产一线天| 精品亚洲永久免费精品| 欧美伦理91i| 国产精自产拍久久久久久| 久久久久久久久久久免费| 亚洲一区二区三区成人在线视频精品| 日韩欧美在线看| 国产欧美日韩精品专区| 国模精品一区二区三区色天香| 精品视频在线播放| 亚洲欧美另类自拍| 97久久国产精品| 欧美在线www| 97在线精品国自产拍中文| 日韩福利视频在线观看| 欧美性资源免费| 久久国产色av| 精品亚洲夜色av98在线观看| 国产精品手机播放| 亚洲国产成人在线播放| 亚洲区中文字幕| 国产在线视频不卡| 欧美中文字幕视频在线观看| 亚洲xxx大片| 国产免费成人av| 久久精品国产欧美亚洲人人爽| 中文字幕久久亚洲| 亚洲a一级视频| 国产精品综合网站| 亚洲第一中文字幕| 国产在线精品成人一区二区三区| 亚洲欧美日韩第一区| 久久久久久91| 国产精品久久久久久婷婷天堂|