WKWebView適配網(wǎng)頁(yè)鏈接包含_blank屬性導(dǎo)致不能跳轉(zhuǎn)的問(wèn)題

前言

下午運(yùn)營(yíng)的同事在A(yíng)PP的跑馬燈上配了一個(gè)淘寶的鏈接,效果如下圖:


SimulatorScreen2018-06-27at20.21.17

但點(diǎn)擊頁(yè)面上的商品,頁(yè)面沒(méi)反應(yīng),打印出來(lái)跳轉(zhuǎn)的鏈接是這樣:
https://uland.taobao.com/coupon/edetail?spm=a3126.7792474/a.1005.1&e=cXimz4TLjIQGQASttHIRqWKQY7MjCdZaX1Ntma1L86+EdvD4wwM+Y73pFa9Azc+ZXBymrrjpoBQ6fLdAZDu8i42sTXYoCSgGDfqEFBOhTczH84UUJ6ek81fdFfqCDAtNSy49IabX1vktw6/aQUEtrNCtedbC7d6D&mt=1&ptl=bucket:_TL-43223;prepvid:a3126.7792474/a_1530101783882_3161184732177076;engpvid:100_10.103.67.73_12253_9391530101784658599;from:temaisearch
檢查了一下鏈接也沒(méi)發(fā)現(xiàn)有什么問(wèn)題,為什么就不能跳轉(zhuǎn)頁(yè)面呢?然后將這個(gè)鏈接寫(xiě)死為 webview頁(yè)面的 url,這時(shí)頁(yè)面可以正常跳轉(zhuǎn)了.為什么相同的一個(gè)鏈接會(huì)因?yàn)椴僮鞯姆绞讲挥?而表現(xiàn)為兩種結(jié)果?

問(wèn)題出現(xiàn)的原因

在電腦瀏覽器上查看了那個(gè)淘寶頁(yè)面的html 元素后,發(fā)現(xiàn)


屏幕快照2018-06-2720.32.11

超鏈接a標(biāo)簽的target屬性為_(kāi)blank

理解 HTML < a>標(biāo)簽的target屬性
_blank -- 在新窗口中打開(kāi)鏈接
_parent -- 在父窗體中打開(kāi)鏈接
_self -- 在當(dāng)前窗體打開(kāi)鏈接,此為默認(rèn)值
_top -- 在當(dāng)前窗體打開(kāi)鏈接横缔,并替換當(dāng)前的整個(gè)窗體(框架頁(yè))

根據(jù)上面的說(shuō)明當(dāng)target屬性值為_(kāi)blank昆汹,是讓瀏覽器新開(kāi)一個(gè)頁(yè)面來(lái)打開(kāi)鏈接艰管,而不是在原網(wǎng)頁(yè)上打開(kāi)匕争。

在UIWebView上履植,只有一個(gè)頁(yè)面妒御,所以會(huì)自動(dòng)在原來(lái)的頁(yè)面上打開(kāi)新鏈接。

但是在WKWebView上就不是這樣了。

用戶(hù)點(diǎn)擊網(wǎng)頁(yè)上的鏈接愿卸,需要打開(kāi)新頁(yè)面時(shí),會(huì)先調(diào)用WKWebView 的 WKNavigationDelegate代理方法:


- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 

這個(gè)方法的參數(shù) WKNavigationAction 中有兩個(gè)屬性:sourceFrame和targetFrame截型,分別代表這個(gè)action的出處和目標(biāo)擦酌。類(lèi)型是 WKFrameInfo 。WKFrameInfo有一個(gè) mainFrame 的屬性菠劝,正是這個(gè)屬性標(biāo)記著這個(gè)frame是在主frame里還是新開(kāi)一個(gè)frame赊舶。

如果 targetFrame 的 mainFrame 屬性為NO,表明這個(gè) WKNavigationAction 將會(huì)新開(kāi)一個(gè)頁(yè)面赶诊。

WKWebView遇到這種情況笼平,將會(huì)調(diào)用 它的 WKUIDelegate 代理方法:


- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;

如果實(shí)現(xiàn)這個(gè)方法,會(huì)返回一個(gè)新的WKWebView舔痪,讓 WKNavigationAction 在新的webView中打開(kāi)寓调。如果你沒(méi)有設(shè)置 WKUIDelegate代理和沒(méi)有實(shí)現(xiàn)這個(gè)代理方法。那么WKWebView將什么事情都不會(huì)做锄码,也就是你點(diǎn)那個(gè)按鈕沒(méi)反應(yīng)夺英。

解決辦法

解決辦法1:

直接在原有的decidePolicyForNavigationAction代理方法中加上以下代碼:

if (navigationAction.targetFrame == nil) {

    [webView loadRequest:navigationAction.request];

}

//如果方法中已有這行代碼,則不需要再加了,否則運(yùn)行會(huì)報(bào)錯(cuò)
decisionHandler(WKNavigationActionPolicyAllow);

解決辦法2:

在代碼中實(shí)現(xiàn)以下代理方法:

-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{

    //假如是重新打開(kāi)窗口的話(huà)
    if (!navigationAction.targetFrame.isMainFrame) {

        [webView loadRequest:navigationAction.request];

    }

    return nil;
}

解決辦法3:

將網(wǎng)頁(yè)上所有a標(biāo)簽的target屬性值都去掉

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

  if (!navigationAction.targetFrame.isMainFrame) {

      [webView evaluateJavaScript:@"var a = document.getElementsByTagName('a');for(var i=0;i<a.length;i++){a[i].setAttribute('target','_self');}" completionHandler:nil];

  }

  decisionHandler(WKNavigationActionPolicyAllow);
}

不過(guò)用這種方式點(diǎn)擊兩次才能跳轉(zhuǎn)撩独,因?yàn)榈谝淮吸c(diǎn)擊時(shí)呐能,會(huì)先用JavaScript腳本把< a >標(biāo)簽target屬性原來(lái)的_blank替換為_(kāi)self,但這時(shí)的navigationAction.targetFrame為nil,因此不會(huì)跳轉(zhuǎn)頁(yè)面。

ScreenShot2018-06-27at6.43.09PM

第二次點(diǎn)擊時(shí)拢锹,navigationAction.targetFrame.isMainFrame的值才為NO施绎,所以這時(shí)才能跳轉(zhuǎn)頁(yè)面妒穴。

ScreenShot2018-06-27at6.46.17PM
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末览祖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扭仁,更是在濱河造成了極大的恐慌垮衷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乖坠,死亡現(xiàn)場(chǎng)離奇詭異搀突,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熊泵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)描姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人戈次,你說(shuō)我怎么就攤上這事⊥舶牵” “怎么了怯邪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)花墩。 經(jīng)常有香客問(wèn)我悬秉,道長(zhǎng),這世上最難降的妖魔是什么冰蘑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任和泌,我火速辦了婚禮,結(jié)果婚禮上祠肥,老公的妹妹穿的比我還像新娘武氓。我一直安慰自己,他們只是感情好仇箱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布县恕。 她就那樣靜靜地躺著,像睡著了一般剂桥。 火紅的嫁衣襯著肌膚如雪忠烛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天权逗,我揣著相機(jī)與錄音美尸,去河邊找鬼冤议。 笑死,一個(gè)胖子當(dāng)著我的面吹牛师坎,可吹牛的內(nèi)容都是我干的恕酸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屹耐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尸疆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起惶岭,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寿弱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后按灶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體症革,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年鸯旁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了噪矛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铺罢,死狀恐怖艇挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情韭赘,我是刑警寧澤缩滨,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站泉瞻,受9級(jí)特大地震影響脉漏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袖牙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一侧巨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞭达,春花似錦司忱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至撮胧,卻和暖如春桨踪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芹啥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工锻离, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铺峭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓汽纠,卻偏偏與公主長(zhǎng)得像卫键,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虱朵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,321評(píng)論 8 265
  • iOS8 以后莉炉,蘋(píng)果推出了一個(gè)新的加載網(wǎng)頁(yè)顯示的框架WebKit,它解決了在UIWebView上加載速度緩...
    皮特曼閱讀 5,288評(píng)論 0 4
  • 是時(shí)候遷移到WKWebView來(lái)了碴犬,github上兼容UIWebView的第三方瀏覽器也是一大把絮宁。WKWebVie...
    wwwbbat閱讀 27,104評(píng)論 28 68
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,089評(píng)論 1 32
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)服协,斷路器绍昂,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139