最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何攔截iOS所有網(wǎng)絡(luò)請求

 更新時間:2018年06月08日 10:41:22   作者:LvesLi  
這篇文章主要介紹了詳解如何攔截iOS所有網(wǎng)絡(luò)請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

背景

最近在研究iOS無埋點統(tǒng)計技術(shù),我們的統(tǒng)計SDK主要分兩部分:點擊事件和網(wǎng)絡(luò)請求。統(tǒng)計所有的點擊事件是采用Method Swizzling實現(xiàn)的,可以做到使用中不需要一行代碼實現(xiàn)統(tǒng)計所有事件,具體細(xì)節(jié)將來我會專門抽幾篇文章介紹。

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

介紹

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


使用場景

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

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

實現(xiàn)

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

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

子類實現(xiàn)的NSURLProtocol方法:

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

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

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

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

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

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

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

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

5.0 實現(xiàn)NSURLConnectionDelegate、NSURLConnectionDataDelegate或者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;
}

攔截第三方網(wǎng)絡(luò)庫方法就是讓第三方使用我們這個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進行網(wǎng)絡(luò)請求

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MAC系統(tǒng)下安裝FFmpeg的圖文教程

    MAC系統(tǒng)下安裝FFmpeg的圖文教程

    這篇文章主要給大家介紹了關(guān)于如何在MAC系統(tǒng)下安裝FFmpeg的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • iOS如何利用一句話完成轉(zhuǎn)場動畫

    iOS如何利用一句話完成轉(zhuǎn)場動畫

    這篇文章主要給大家介紹了關(guān)于iOS如何利用一句話完成轉(zhuǎn)場動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • iOS框架AVFoundation實現(xiàn)相機拍照、錄制視頻

    iOS框架AVFoundation實現(xiàn)相機拍照、錄制視頻

    這篇文章主要為大家詳細(xì)介紹了iOS框架AVFoundation實現(xiàn)相機拍照、錄制視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳解iOS WebDriverAgent 環(huán)境搭建

    詳解iOS WebDriverAgent 環(huán)境搭建

    這篇文章主要介紹了詳解iOS WebDriverAgent 環(huán)境搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 在uiview 的tableView中點擊cell進入跳轉(zhuǎn)到另一個界面的實現(xiàn)方法

    在uiview 的tableView中點擊cell進入跳轉(zhuǎn)到另一個界面的實現(xiàn)方法

    這篇文章主要介紹了在uiview 的tableView中點擊cell進入跳轉(zhuǎn)到另一個界面的實現(xiàn)方法,首先重寫uiviewcontrol方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Xcode 9下適配iPhoneX導(dǎo)致iOS 10不兼容問題的解決方法

    Xcode 9下適配iPhoneX導(dǎo)致iOS 10不兼容問題的解決方法

    這篇文章主要給大家介紹了關(guān)于Xcode 9下適配iPhoneX導(dǎo)致iOS 10不兼容問題的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 使用scrollTop()解決IOS中輸入法遮擋輸入框問題

    使用scrollTop()解決IOS中輸入法遮擋輸入框問題

    ios瀏覽器上輸入法會彈出遮擋輸入框問題,下面小編給大家分享scrollTop()解決IOS中輸入法遮擋輸入框問題,一起看看吧
    2017-09-09
  • iOS中json解析出現(xiàn)的null,nil,NSNumber的解決辦法

    iOS中json解析出現(xiàn)的null,nil,NSNumber的解決辦法

    在iOS開發(fā)過程中經(jīng)常需要與服務(wù)器進行數(shù)據(jù)通訊,Json就是一種常用的高效簡潔的數(shù)據(jù)格式,通過本文給大家介紹iOS中json解析出現(xiàn)的null,nil,NSNumber的解決辦法,感興趣的朋友參考下
    2016-01-01
  • iOS仿熱門話題熱點輪播界面tableView

    iOS仿熱門話題熱點輪播界面tableView

    這篇文章主要為大家詳細(xì)介紹了iOS仿熱門話題熱點輪播界面tableView,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 舉例講解設(shè)計模式中的原型模式在iOS應(yīng)用開發(fā)中的作用

    舉例講解設(shè)計模式中的原型模式在iOS應(yīng)用開發(fā)中的作用

    這篇文章主要介紹了設(shè)計模式中的原型模式在iOS應(yīng)用開發(fā)中的作用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-04-04

最新評論

宜都市| 明光市| 金坛市| 福鼎市| 河津市| 花莲县| 锡林郭勒盟| 遵化市| 霍城县| 广州市| 兰西县| 涞源县| 措勤县| 梁河县| 永仁县| 双峰县| 铁力市| 乌什县| 辉县市| 司法| 中山市| 上犹县| 黎城县| 乌鲁木齐县| 麻江县| 孟州市| 新竹市| 四会市| 唐海县| 莲花县| 绥化市| 色达县| 工布江达县| 福州市| 彝良县| 汽车| 全南县| 远安县| 腾冲县| 宾川县| 礼泉县|