webView加載多個連接時判斷是否是第一個連接失敗

要點:1.isEqualToString的使用

? ? ? ? ?2.NSURL與字符串的轉(zhuǎn)換比較




? ? ? ?問題:用一個webView加載一個html邮偎,html先是有一段文字和圖片乐疆,再有就是此html內(nèi)嵌了一個iframe吠冤,iframe里面有另外一個連接(比如一個視頻連接),這時候用webView去加載這個html砚尽,假如這個iframe里的視頻連接是錯誤的,加載不了梦碗,會報錯,這就會觸發(fā)webView的代理方法didFailLoadWithError,但是此html的連接是沒有問題的洪规,可以正常加載到文字和圖片印屁。這時候,如果我們需要在didFailLoadWithError方法里添加一個errorView 來提示加載出錯斩例,那么就會出現(xiàn)這樣的情況:盡管html連接沒有錯雄人,文字圖片也加載出來了,但是由于iframe里的連接出錯念赶,也會觸發(fā)didFailLoadWithError從而彈出我們設定的errorView础钠,進而阻止我們操作頁面,如下圖:

一個無錯誤頁面內(nèi)含有一個錯誤鏈接的iframe


? ? ? 但是實際上我們想要的結(jié)果是這樣的:只要文字和圖片加載出來了叉谜,即使視頻無法加載旗吁,也不要彈出“加載失敗”這個框,只有當文字都加載不成功時才需要彈出這樣一個框停局,那么這時個就要找出哪個連接加載失敗哪個加載成功了很钓,進而作出選擇性地在相應連接出錯時才彈出錯誤窗口。


經(jīng)過打印跟蹤可以發(fā)現(xiàn)董栽,在webView的代理方法:shouldStartLoadWithRequest? 里码倦,會先后順序地加載請求連接,就是說在此方法里的request先會是加載html里的連接(就是webView loadRequest:url 中的這個連接)锭碳,再順序地加載到html里的iframe/src/js/css等的連接叹洲,那么這樣就可以在didFailLoadWithError方法里拿到加載出錯的連接來與這個html的url對比了,如果出錯的連接是這個url就讓他彈框工禾,如果不是就不用彈。


解決辦法:


定一個全局可變數(shù)組:NSMutableArray *firstRequestUrl;

首先初始化一個webView

UIWebView *myWebView = [[UIWebView alloc]initWithFrame:self.view.bounds];

[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"aaa://bbbbb"]]];

myWebView.delegate = self;

[self.view addSubview:myWebView];

然后在shouldStartLoadWithRequest方法里只允許他添加第一個url

NSString *webViewRequestUrl = request.URL.absoluteString;

if (firstRequestUrl == nil) {

? ? ? ?firstRequestUrl = [NSMutableArray arrayWithCapacity:1];

? ? ? ?if (firstRequestUrl.count == 0) {

? ? ? ? ? ? ? ?[firstRequestUrl addObject:webViewRequestUrl];

? ? ? ?}

}


然后在didFailLoadWithError方法里拿到出錯的url,

NSURL *failLoadUrlString = error.userInfo[@"NSErrorFailingURLKey"];

可以打印error看看里面都有什么蝗柔,注意這里是NSURL,如果硬是寫成了下面這樣:

// NSString *failLoadUrlString = (NSString *)error.userInfo[@"NSErrorFailingURLKey"];

當查看failLoadUrlString屬性時仍然是NSURL類型的闻葵,這就不能與上面獲得的字符串比較了,所以在下面比較時要先將NSURL轉(zhuǎn)成NSString


if ([firstRequestUrl[0] isEqualToString:[failLoadUrlString absoluteString]]) {

? ? ? ?NSLog(@"兩個字符串相等,所以出錯的是第一個html的連接");

? ? ? ?//這時候就可以在這里寫彈出框了

}else{

? ? ? ?NSLog(@"兩個字符串不相等癣丧,就說明出錯的有可能是html里面的連接");

? ? ? //這時候就可以在這里隱藏彈框了

}


做完這一步槽畔,實際上上面的問題已經(jīng)解決,無論一個頁面內(nèi)含有多少個iframe胁编,iframe里面含有多少個鏈接厢钧,不管這些鏈接錯誤與否,只要出錯的鏈接不是這個頁面的主鏈接(第一個鏈接)嬉橙,那么就不會彈出錯誤提示框了早直。

但新的問題來了:


當我們用webView去加載一個電腦版的網(wǎng)址時,比如:http://www.qq.com/,這時在shouldStartLoadWithRequest代理方法中申請請求的url為http://www.qq.com/,但在請求過程中市框,會自動轉(zhuǎn)換成觸屏版的網(wǎng)址霞扬,即:http://xw.qq.com/index.htm,這時候,在failDidLoad方法中會監(jiān)測到錯誤鏈接:http://www.qq.com,且為第一個,但實際上整個請求頁面是可以實現(xiàn)的喻圃。如果按照上面的寫法萤彩,則會出現(xiàn)如下情況,且在有彈出框的情況下頁面是不可控的:

請求電腦版網(wǎng)址會自動跳轉(zhuǎn)觸屏版

那么就不能按上面的寫法了斧拍,這時候可以這樣解決:

在shouldStartLoadWithRequest里計數(shù)請求的鏈接數(shù)count1雀扶,比如上面的qq.com請求過程中,由于會自動轉(zhuǎn)換成觸屏版的鏈接肆汹,所以實際上在這個代理方法中申請請求的鏈接個數(shù)為2個愚墓,可以打NSLog看到。

然后在FailDidLoad里再計數(shù)失敗的鏈接數(shù)count2,如上面的例子县踢,這里的count2個數(shù)為1转绷;

將count1 與 count2 比較,如果相等硼啤,彈框议经,如果不相等,忽略錯誤谴返,不彈框煞肾,意為整個請求頁面中只要有一個鏈接請求正確都不彈框;用這個方法代替上面的方法嗓袱,既可以避免頁面帶iframe且iframe里有錯誤鏈接時導致彈框籍救,又可以避免請求網(wǎng)址為電腦版時自動轉(zhuǎn)換為觸屏版時導致彈框這兩個問題。

暫時沒有測試到其他情況渠抹,大家發(fā)現(xiàn)的話請幫忙提出進行修改蝙昙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梧却,隨后出現(xiàn)的幾起案子奇颠,更是在濱河造成了極大的恐慌,老刑警劉巖放航,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烈拒,死亡現(xiàn)場離奇詭異,居然都是意外死亡广鳍,警方通過查閱死者的電腦和手機荆几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赊时,“玉大人吨铸,你說我怎么就攤上這事∽婷耄” “怎么了焊傅?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵剂陡,是天一觀的道長。 經(jīng)常有香客問我狐胎,道長鸭栖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任握巢,我火速辦了婚禮晕鹊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暴浦。我一直安慰自己溅话,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布歌焦。 她就那樣靜靜地躺著飞几,像睡著了一般。 火紅的嫁衣襯著肌膚如雪独撇。 梳的紋絲不亂的頭發(fā)上屑墨,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音纷铣,去河邊找鬼卵史。 笑死,一個胖子當著我的面吹牛搜立,可吹牛的內(nèi)容都是我干的以躯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼啄踊,長吁一口氣:“原來是場噩夢啊……” “哼忧设!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颠通,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤见转,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒜哀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吏砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年撵儿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狐血。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡淀歇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匈织,到底是詐尸還是另有隱情浪默,我是刑警寧澤牡直,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站纳决,受9級特大地震影響碰逸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阔加,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一饵史、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胜榔,春花似錦胳喷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尊惰,卻和暖如春讲竿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背择浊。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工戴卜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琢岩。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓投剥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親担孔。 傳聞我的和親對象是個殘疾皇子江锨,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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