iOS WebView 攔截Ajax請求


title: iOS WebView 攔截Ajax請求
date: 2016-04-12 00:08:11
tags: [iOS,Ajax,WebView]
desc: 利用iOS WebView 注入js 攔截Ajax請求


iOS攔截WebView Request 請求

相信大家都不陌生,這個在WebView delegate里有實現(xiàn)
貼一段代碼

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    request = [IBWebMethod formAuthorizationRequest:request];
    return [IBWebMethod interceptRequest:request BaseViewController:self];
}

ture or false 來決定WebView 是否加載請求痴脾。
可以通過new NSURLRequest賦給原request來向request里添加自定義的信息(頭或參數(shù))

但是由于Ajax 請求不是刷新整個WebView,上面的方法中無法捕獲拱礁。

于是就想到了想到了通過注入js來pop 出Ajax事件來捕獲嘹锁。
StackOverFlow鏈接

var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
    console.log('mpAjaxHandler://' + this.url);
    window.location='mpAjaxHandler://' + this.url;
};
s_ajaxListener.callbackDone = function (state,status) {
    console.log('mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url);
    window.location='mpAjaxHandlerDone://' + state + ':' + status + '/' + this.url;
};

// Added this function to catch the readyState changes and request
// fake page loads.
function override_onreadystatechange(){
    s_ajaxListener.callbackDone(this.readyState);
    this.original_onreadystatechange();
}

XMLHttpRequest.prototype.open = function(a,b) {
    if (!a) var a='';
    if (!b) var b='';
    s_ajaxListener.tempOpen.apply(this, arguments);
    s_ajaxListener.method = a;
    s_ajaxListener.url = b;
    if (a.toLowerCase() == 'get') {
        s_ajaxListener.data = b.split('?');
        s_ajaxListener.data = s_ajaxListener.data[1];
    }
}
XMLHttpRequest.prototype.send = function(a,b) {
    if (!a) var a='';
    if (!b) var b='';
    this.setCoustomHeader();
    s_ajaxListener.tempSend.apply(this, arguments);
    if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
    s_ajaxListener.callback();
    
    // Added this to intercept Ajax responses for a given send().
    this.original_onreadystatechange = this.onreadystatechange;
    this.onreadystatechange = override_onreadystatechange;
}

可以看到重寫了XMLHttpRequest(Ajax)的open與send方法來pop出事件
在捕獲的事件中重新指定了window.location來響應(yīng)WebView的delegate

但是這樣還不能滿足我的需求豌注,因為Ajax請求已經(jīng)發(fā)出去了妙真,我們需要在Ajax請求中加入頭

上代碼

+ (NSString *)jsString:(NSString *)baseString{
    return [NSString stringWithFormat:@"%@\n XMLHttpRequest.prototype.setCoustomHeader = function(){ this.setRequestHeader(\"Authorization\",\"%@\");}", baseString, [IBDataManager sharedManager].baseAuth];
}

同樣利用js注入把我們的頭加入的Ajax請求中
達到了Ajax自定義header 與捕獲的需求

iOS UIWebView 有很大的性能和內(nèi)存泄漏的問題
可以考慮將UIWebView與WKWebView封裝成一套API來調(diào)用

最近在開發(fā)新的需求和重構(gòu)代碼蝠嘉,這段重構(gòu)把WebView單獨拿出來做成了一個BaseWebViewController最疆,為下一步將UIWebView與WKWebView統(tǒng)一做準(zhǔn)備。

努力蚤告,認(rèn)真努酸,加油!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杜恰,一起剝皮案震驚了整個濱河市获诈,隨后出現(xiàn)的幾起案子仍源,更是在濱河造成了極大的恐慌,老刑警劉巖烙荷,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜会,死亡現(xiàn)場離奇詭異,居然都是意外死亡终抽,警方通過查閱死者的電腦和手機戳表,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昼伴,“玉大人匾旭,你說我怎么就攤上這事∑越迹” “怎么了价涝?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長持舆。 經(jīng)常有香客問我色瘩,道長,這世上最難降的妖魔是什么逸寓? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任居兆,我火速辦了婚禮,結(jié)果婚禮上竹伸,老公的妹妹穿的比我還像新娘泥栖。我一直安慰自己,他們只是感情好勋篓,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布吧享。 她就那樣靜靜地躺著,像睡著了一般譬嚣。 火紅的嫁衣襯著肌膚如雪钢颂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天拜银,我揣著相機與錄音殊鞭,去河邊找鬼。 笑死盐股,一個胖子當(dāng)著我的面吹牛钱豁,可吹牛的內(nèi)容都是我干的耻卡。 我是一名探鬼主播疯汁,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卵酪!你這毒婦竟也來了幌蚊?” 一聲冷哼從身側(cè)響起谤碳,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溢豆,沒想到半個月后蜒简,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡漩仙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年搓茬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队他。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卷仑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麸折,到底是詐尸還是另有隱情锡凝,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布垢啼,位于F島的核電站窜锯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芭析。R本人自食惡果不足惜锚扎,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望放刨。 院中可真熱鬧工秩,春花似錦、人聲如沸进统。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螟碎。三九已至眉菱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掉分,已是汗流浹背俭缓。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酥郭,地道東北人华坦。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像不从,于是被迫代替她去往敵國和親惜姐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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