iOS 抓包原理

攔截原理:

  • NSURLProtocol 是蘋果為我們提供的 URL Loading System 的一部分,在每一個(gè) HTTP 請(qǐng)求開始時(shí)吱涉,URL 加載系統(tǒng)創(chuàng)建一個(gè)合適的 NSURLProtocol 對(duì)象處理對(duì)應(yīng)的 URL 請(qǐng)求刹泄,而我們需要做的就是寫一個(gè)繼承自 NSURLProtocol 的類,并通過 - registerClass: 方法注冊(cè)我們的協(xié)議類怎爵,然后 URL 加載系統(tǒng)就會(huì)在請(qǐng)求發(fā)出時(shí)使用我們創(chuàng)建的協(xié)議對(duì)象對(duì)該請(qǐng)求進(jìn)行處理特石。
// 1.注冊(cè)我們的協(xié)議類
[NSURLProtocol registerClass:[DLCustomURLProtocol class]];

### 攔截方法的介紹:
// 2.是否能夠處理給定的請(qǐng)求
+ (BOOL)canInitWithRequest:(NSURLRequest *)request;

// 3.處理URL轉(zhuǎn)換為IP地址
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request;

// 4.開始網(wǎng)絡(luò)請(qǐng)求
- (void)startLoading;

// 5.結(jié)束網(wǎng)絡(luò)請(qǐng)求
- (void)stopLoading;

// 6.處理網(wǎng)絡(luò)請(qǐng)求的code
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                 didReceiveResponse:(NSURLResponse *)response
                                  completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;

// 7.處理網(wǎng)絡(luò)請(qǐng)求的返回信息
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error;

WKWebView使用私有API的原因:

  • WKURLSchemeHandler是iOS11就推出的,用于處理自定義請(qǐng)求的方案鳖链,不過并不能處理HTTP姆蘸、HTTPS等常規(guī)scheme。但是現(xiàn)在有另外一個(gè)方法芙委,就是去 WKWebview的initWithFrame:方法逞敷,然后設(shè)置一個(gè)WKURLSchemeHandler給WKWebview實(shí)例,這樣就能截獲WKWebview的HTTP和HTTPS請(qǐng)求了灌侣。
    WebKit 進(jìn)程是獨(dú)立于 app 進(jìn)程之外的推捐,兩個(gè)進(jìn)程之間使用消息隊(duì)列的方式進(jìn)行進(jìn)程間通信。比如 app 想使用 WKWebView 加載一個(gè)請(qǐng)求侧啼,就要把請(qǐng)求的參數(shù)打包成一個(gè) Message牛柒,然后通過 IPC 把 Message 交給 WebKit 去加載堪簿,反過來 WebKit 的請(qǐng)求想傳到 app 進(jìn)程的話(比如 URLProtocol ),也要打包成 Message 走 IPC焰络。出于性能的原因戴甩,打包的時(shí)候 HTTPBody 和 HTTPBodyStream 這兩個(gè)字段被丟棄掉了,這個(gè)可以參考 WebKit 的源碼闪彼,這就導(dǎo)致 -[WKWebView loadRequest:] 傳出的 HTTPBody 和 NSURLProtocol 傳回的 HTTPBody 全都被丟棄掉了甜孤。所以如果通過 NSURLProtocol 注冊(cè)攔截 http scheme,那么由 WebKit 發(fā)起的所有 http POST 請(qǐng)求就全都無效了.
#pragma mark - WKWebView的私有API
#pragma mark - 以下方法為iOS的私有方法畏腕,建議上線時(shí)注釋————以下全部代碼
+ (void)DL_unregisterScheme {
    [self wk_registerScheme:@"http"];
    [self wk_registerScheme:@"https"];
}

FOUNDATION_STATIC_INLINE Class ContextControllerClass() {
    static Class cls;
    if (!cls) {
        cls = [[[WKWebView new] valueForKey:@"browsingContextController"] class];
    }
    return cls;
}

FOUNDATION_STATIC_INLINE SEL RegisterSchemeSelector() {
    return NSSelectorFromString(@"registerSchemeForCustomProtocol:");
}

+ (void)wk_registerScheme:(NSString *)scheme {
    Class cls = ContextControllerClass();
    SEL sel = RegisterSchemeSelector();
    if ([(id)cls respondsToSelector:sel]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        [(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
    }
}

抓取第三方AFN請(qǐng)求

  • 對(duì)于NSURLSession的網(wǎng)絡(luò)請(qǐng)求缴川,需要替換protocolClasses方法
+ (void)exchangeAFNSessionConfiguration {
    Class cls = NSClassFromString(@"__NSCFURLSessionConfiguration") ?: NSClassFromString(@"NSURLSessionConfiguration");
    Method originalMethod = class_getInstanceMethod(cls, @selector(protocolClasses));
    Method stubMethod = class_getInstanceMethod([DLCustomURLProtocol class], @selector(protocolClasses));
    if (!originalMethod || !stubMethod) {
        CLog(@"Couldn't load NEURLSessionConfiguration");
        return;
    }
    method_exchangeImplementations(originalMethod, stubMethod);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市描馅,隨后出現(xiàn)的幾起案子把夸,更是在濱河造成了極大的恐慌,老刑警劉巖铭污,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恋日,死亡現(xiàn)場離奇詭異,居然都是意外死亡嘹狞,警方通過查閱死者的電腦和手機(jī)岂膳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磅网,“玉大人谈截,你說我怎么就攤上這事〗担” “怎么了簸喂?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長燎潮。 經(jīng)常有香客問我喻鳄,道長,這世上最難降的妖魔是什么确封? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任诽表,我火速辦了婚禮,結(jié)果婚禮上隅肥,老公的妹妹穿的比我還像新娘竿奏。我一直安慰自己,他們只是感情好腥放,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布泛啸。 她就那樣靜靜地躺著,像睡著了一般秃症。 火紅的嫁衣襯著肌膚如雪候址。 梳的紋絲不亂的頭發(fā)上吕粹,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音岗仑,去河邊找鬼匹耕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荠雕,可吹牛的內(nèi)容都是我干的稳其。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼炸卑,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼既鞠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盖文,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤嘱蛋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后五续,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洒敏,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年疙驾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桐玻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荆萤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铣卡,到底是詐尸還是另有隱情链韭,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布煮落,位于F島的核電站敞峭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝉仇。R本人自食惡果不足惜旋讹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轿衔。 院中可真熱鬧沉迹,春花似錦、人聲如沸害驹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宛官。三九已至葫松,卻和暖如春瓦糕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腋么。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工咕娄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人珊擂。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓圣勒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親未玻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灾而,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 注:本篇研究重點(diǎn)不在于某個(gè)離線方案的具體使用,而在于對(duì)方案的優(yōu)缺點(diǎn)分析扳剿、探究和選型旁趟,以及一些我個(gè)人的看法。 前言 ...
    LotLewis閱讀 9,984評(píng)論 7 16
  • 背景 為了快遞迭代庇绽、更新锡搜,公司app有一大模塊功能使用H5實(shí)現(xiàn),但是體驗(yàn)比原生差瞧掺,這就衍生了如何提高H5加載速度耕餐,...
    edison0428閱讀 914評(píng)論 0 1
  • 業(yè)內(nèi)已有的 WKWebView 請(qǐng)求攔截方案,主要分為如下兩種 1辟狈、NSURLProtocol NSURLProt...
    tom__zhu閱讀 10,044評(píng)論 0 12
  • 前言 關(guān)于UIWebView的介紹,相信看過上文的小伙伴們壹蔓,已經(jīng)大概清楚了吧趟妥,如果有問題,歡迎提問佣蓉。 本文是本系列...
    Dark_Angel閱讀 28,865評(píng)論 67 291
  • 導(dǎo)語 WKWebView 是蘋果在 WWDC 2014 上推出的新一代 webView 組件披摄,用以替代 UIKit...
    Jecky丶閱讀 8,450評(píng)論 2 22