目前移動(dòng)端的開發(fā)中會(huì)經(jīng)常使用到加載H5凰锡。Apple提供了兩種加載WebView的控件圈暗,一個(gè)是UIWebView,一個(gè)是WKWebView菩掏。WKWebView 是 Apple WWDC 2014隨iOS 8和OS X 出來(lái)的昵济,解決UIWebView加載速度慢野揪、占用內(nèi)存大的問題。之前的開發(fā)中我們要適配iOS7海铆,所以未使用≌醵瑁現(xiàn)在項(xiàng)目都適配iOS 8以上了殴边,所以就開始使用WKWebView了锤岸。下面是在開發(fā)中遇到的一個(gè) goback執(zhí)行無(wú)效 的坑板乙,故記錄下來(lái)。
1.先在這里貼上運(yùn)行效果蛋铆,大家可以先看一下。
返回失效bug.gif
屏幕快照 2018-05-09 下午3.25.13.png
gif是操作到點(diǎn)擊系統(tǒng)導(dǎo)航返回按鈕的時(shí)候斷點(diǎn)走了進(jìn)去,但是斷點(diǎn)去掉后同樣停留在了當(dāng)前的展示的興業(yè)銀行的界面了纠脾。這也就是 goBack執(zhí)行,但是并未生效捧韵。
2.解決bug步驟
1.進(jìn)入過WKWebView里面看過的話我們會(huì)知道它內(nèi)部有一個(gè)屬性是 backForwardList 瀏覽列表再来。
11525851885_.pic_hd.jpg
可以看到這里聲明了一個(gè) WKBackForwardList *backForwardList磷瘤;上面清晰的寫出了 The item immediately following the current item, or nil if there isn't one. 這句話的意思是 緊隨當(dāng)前項(xiàng)目的項(xiàng)目,如果沒有针炉,則為零扳抽。那么點(diǎn)擊進(jìn)去WKBackForwardList可以看到里面還包含了一個(gè)屬性backlist,那么就很清楚這個(gè)是返回列表了贸呢。所以這里在返回點(diǎn)擊事件中打印下這個(gè)值楞陷,看下這個(gè)值是否正確。
到這一步很明顯我們是對(duì)的结执,確實(shí)我們走到興業(yè)銀行界面時(shí),我們是走了3層坚芜。
那為什么goback會(huì)失效呢斜姥?
3.找到原因
之后由公司iOS大神指導(dǎo)后,發(fā)現(xiàn)了問題铸敏。之前寫goback的時(shí)候很少會(huì)有人點(diǎn)進(jìn)去看一下goback的返回值杈笔。進(jìn)去后發(fā)現(xiàn)goback返回值為 WKNavigation , 所以這里我們嘗試打印出這個(gè)WKNavigation蒙具,看下這個(gè)WKNavigation值是什么。下面是打印出來(lái)的:
21525853471_.pic_hd.jpg
走到這一步我們可以清楚看到走到興業(yè)銀行頁(yè)面返回時(shí)持钉,Navigation 為nil了每强。所以我們大致就定位到問題是在Navigation上面州刽,因?yàn)镹avigation為nil,所以導(dǎo)致goback執(zhí)行無(wú)效穗椅。
4.解決問題
問題已經(jīng)找到了,那么我們應(yīng)該如何讓他返回到我們指定的頁(yè)面呢门坷? 這時(shí)候我們還是需要去找第二個(gè)問題里面我們發(fā)現(xiàn)的歷史列表桑孩。 WKBackForwardList; 這個(gè)文件中我們可以進(jìn)去看下,如圖:
這里我們可以看到里面有函數(shù)是 itemAtIndex 宣虾,這個(gè)函數(shù)是可以獲取到我們要跳轉(zhuǎn)到的頁(yè)面。我們看下他注釋的意思 可以知道 0 為當(dāng)前項(xiàng)绣硝,1為下一項(xiàng) -1為上一項(xiàng)。那么看到這里我們就可以試著去做嘗試了首先我們拿到nav握玛。這里我們要使用while來(lái)循環(huán)這個(gè)變量甫菠。然后調(diào)用指定返回的函數(shù)。代碼如下:
WKBackForwardListItem *item1 = [self.webView.backForwardList itemAtIndex:-1];
navigation = [self.webView goToBackForwardListItem:item1];
這里我們運(yùn)行就可以看到效果可以返回了拂苹。但是我們要實(shí)現(xiàn)永遠(yuǎn)返回到上一頁(yè)如何去做呢痰洒。這里我們可以聲明一個(gè)變量,在while循環(huán)時(shí)給他進(jìn)行++脯宿,然后通過這個(gè)變量我們尋找我們需要返回到的item嗅绰。然后指定去返回。整體代碼如下
WKNavigation *navigation = [self.webView goBack];
NSInteger offset = 1;
while (!navigation)
{
offset++;
if (self.webView.backForwardList.backList.count >= offset)
{
WKBackForwardListItem *item1 = [self.webView.backForwardList itemAtIndex:-offset];
navigation = [self.webView goToBackForwardListItem:item1];
}
else
{
break;
}
}