WKWebView 使用問題整理

前言

目前App基本都需要嵌入大量H5頁面, 這就需要App提供與JS交互能力, 作者這篇就簡單整理WKWebView使用常見問題.

一. WKWebView處理window.open問題

  • 1. WKWebView加載頁面, 當(dāng)頁面使用window.open跳轉(zhuǎn)時候, 無響應(yīng), 需要實現(xiàn)WKUIDelegate協(xié)議實現(xiàn)
-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{

    WKFrameInfo *frameInfo = navigationAction.targetFrame;
    if (![frameInfo isMainFrame]) {
         //1. 本頁跳轉(zhuǎn)
        [webView loadRequest:navigationAction.request];

        //2. 獲取url 打開新的 vc 實現(xiàn)跳轉(zhuǎn)到新頁面
        //NSString *urlStr = [[navigationAction.request URL] absoluteString];
    }
    return nil;
}

注意 :
1- 使用 window.open 在移動端可能引發(fā)兼容問題, 建議前端對移動端標(biāo)簽使用location.href處理
2- ajax 處理window.open時候, 同步時可以響應(yīng)跳轉(zhuǎn), 異步時不會響應(yīng)跳轉(zhuǎn)

$.ajax({
      url: '',
      async: true,
      complete: function (xhr) {          
          window.open("http://www.baidu.com");
      }                   
});

二. WKWebView處理a標(biāo)簽問題

  • 1. WKWebView加載頁面, 當(dāng)頁面使用a標(biāo)簽跳轉(zhuǎn)時 跳轉(zhuǎn)方式 (1)本頁跳轉(zhuǎn)target="_self", webview可以正常跳轉(zhuǎn); (2)新頁面跳轉(zhuǎn)target="_blank", webview無響應(yīng), 需要進(jìn)行處理, 才能跳轉(zhuǎn)
 方案1: 不建議使用

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
    // 將a標(biāo)簽 跳轉(zhuǎn)方式全部改為本頁
    [webView evaluateJavaScript:@"var aArr = document.getElementsByTagName('a');for(var i=0;i<aArr.length;i++){aArr[i].setAttribute('target','');}" completionHandler:nil];
}
方案2: WKNavigationDelegate協(xié)議實現(xiàn)

-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
    // webview 本頁重新加載
    if (navigationAction.targetFrame == nil) {
        [webView loadRequest:navigationAction.request];
    }
    decisionHandler(WKNavigationActionPolicyAllow);
    return;

}
方案3: WKUIDelegate協(xié)議實現(xiàn)

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

    WKFrameInfo *frameInfo = navigationAction.targetFrame;
    if (![frameInfo isMainFrame]) {

     // 可創(chuàng)建新頁面打開 [WebView new]
     // 也可重新加載本頁面 [webView loadRequest:navigationAction.request];
     
    }
    return nil;

}

注意 : 如果方案2方案3 代碼中均實現(xiàn), 程序會先執(zhí)行方案2

三. WKWebView處理alert 問題

  • WKWebView加載頁面, 當(dāng)頁面使用alert()睬愤、confirm()和prompt(),默認(rèn)無響應(yīng). 若要正常使用這三個方法橘霎,需要實現(xiàn)WKUIDelegate中的三個方法模擬JS的這三個方法
JS 處理實現(xiàn)方法
function showAlert() {
     alert("js_alertMessage");
}

function showConfirm() {
     confirm("js_confirmMessage");
}

function showPrompt() {
     prompt("js_prompt", "js_prompt_defaultMessage");
}

 App 處理
//! alert(message)
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
     completionHandler();
}

//! confirm(message)
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
     completionHandler();
}

//! prompt(prompt, defaultText)
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler {
      completionHandler();
}

注意: completionHandler();需要被執(zhí)行, 不然會引發(fā)crash.

四. WKWebView與JS簡單交互

-WKWebView加載頁面, 當(dāng)需要給js簡單交互, 可如下處理

// JS 處理
document.getElementById("btn").onclick =  function () {
                
    var url = "APP://action?params";
    window.location.href = url;
}

// App 處理
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

    if ([navigationAction.request.URL.scheme caseInsensitiveCompare:@"APP"] == NSOrderedSame) {
        // 進(jìn)行業(yè)務(wù)處理
        decisionHandler(WKNavigationActionPolicyCancel);
    }else{
         if (navigationAction.targetFrame == nil) {
             [webView loadRequest:navigationAction.request];
         }
         decisionHandler(WKNavigationActionPolicyAllow);
    }
    return;
}


// App 處理
NSString *func = [NSString stringWithFormat:@"loadData('%@', '%@')", @"aaa", @"bbb"];
[webView evaluateJavaScript:func completionHandler:nil];

// JS 處理
function loadData(action, params){
                
    document.getElementById("returnValue").innerHTML = action + '?' + params;
}


注意:
1 webView調(diào)用 evaluateJavaScript:completionHandler:方法, 要確保前端的JS方法不在閉包中, 如window.onload = function() {} 中的方法就無法調(diào)用.
2 如果交互復(fù)雜 可以使用 WebViewJavascriptBridge 實現(xiàn)

五. WKWebView相關(guān)文檔

WKWebView 那些坑
讓 WKWebView 支持 NSURLProtocol

以 上 !

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浅侨,一起剝皮案震驚了整個濱河市购公,隨后出現(xiàn)的幾起案子歼郭,更是在濱河造成了極大的恐慌,老刑警劉巖旬盯,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件经伙,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗓节,警方通過查閱死者的電腦和手機(jī)荧缘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拦宣,“玉大人截粗,你說我怎么就攤上這事』肿牛” “怎么了桐愉?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掰派。 經(jīng)常有香客問我从诲,道長,這世上最難降的妖魔是什么靡羡? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任系洛,我火速辦了婚禮,結(jié)果婚禮上略步,老公的妹妹穿的比我還像新娘描扯。我一直安慰自己,他們只是感情好趟薄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布绽诚。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恩够。 梳的紋絲不亂的頭發(fā)上卒落,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音蜂桶,去河邊找鬼儡毕。 笑死,一個胖子當(dāng)著我的面吹牛扑媚,可吹牛的內(nèi)容都是我干的腰湾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疆股,長吁一口氣:“原來是場噩夢啊……” “哼费坊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旬痹,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤葵萎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唱凯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谎痢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年磕昼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片节猿。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡票从,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滨嘱,到底是詐尸還是另有隱情峰鄙,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布太雨,位于F島的核電站吟榴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏囊扳。R本人自食惡果不足惜吩翻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锥咸。 院中可真熱鬧狭瞎,春花似錦、人聲如沸搏予。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碗殷,卻和暖如春精绎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿扁。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工捺典, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人从祝。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓襟己,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牍陌。 傳聞我的和親對象是個殘疾皇子擎浴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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