OC和JS交互(WKWebView)入門(mén)篇

在iOS8.0, 蘋(píng)果推出了WebKit框架, 但時(shí)至今日, 仍然有很多公司需要支持iOS8以下的系統(tǒng), 所以可能還沒(méi)有將UIWebView完全更換成WKWebView, WKWebView的性能上的表現(xiàn)確實(shí)比UIWebView好很多, 但是坑也很多, 要用WKWebView就要接受它的坑.

前面的一些列文章著重講述了UIWebView和JS的交互, 下面是參考鏈接

OC和JS交互(UIWebView)入門(mén)篇
OC和JS交互(UIWebView)中級(jí)篇1
OC和JS交互(UIWebView)中級(jí)篇2
OC和JS交互(UIWebView)中級(jí)篇3

WKWebView和UIWebView一樣, 在和JS交互的時(shí)候也可以通過(guò)JS注入的方式, 而且在WebViewJavaScriptBridge框架中也提供了對(duì)WKWebView的支持. 這里只對(duì)和UIWebView不同的地方進(jìn)行說(shuō)明.

- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    if (webView != _webView) { return; }
    NSURL *url = navigationAction.request.URL;
    __strong typeof(_webViewDelegate) strongDelegate = _webViewDelegate;

    if ([_base isCorrectProcotocolScheme:url]) {
        if ([_base isBridgeLoadedURL:url]) {
            [_base injectJavascriptFile];
        } else if ([_base isQueueMessageURL:url]) {
            [self WKFlushMessageQueue];
        } else {
            [_base logUnkownMessage:url];
        }
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    
    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) {
        [_webViewDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
    } else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

上面的代碼是WKWebView的代理方法, 當(dāng)改變網(wǎng)頁(yè)的src屬性, 就會(huì)觸發(fā)這個(gè)代理被調(diào)用, 和UIWebView- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType類(lèi)似, 這里需要注意一點(diǎn), 要確保- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler代理一定調(diào)用到decisionHandler否則會(huì)崩潰, 而且不能重復(fù)調(diào)用, 這里原著應(yīng)該是有個(gè)bug的.

if ([_base isCorrectProcotocolScheme:url]) {
        if ([_base isBridgeLoadedURL:url]) {
            [_base injectJavascriptFile];
        } else if ([_base isQueueMessageURL:url]) {
            [self WKFlushMessageQueue];
        } else {
            [_base logUnkownMessage:url];
        }
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }

上面的if分支一定要return, 否則會(huì)崩潰

'NSInternalInconsistencyException', reason: 'Completion handler passed to -[WKWebViewJavascriptBridge webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once'

信息已經(jīng)說(shuō)的很明白了, 多次調(diào)用decisionHandler.
這里對(duì)于OC和JS交互(UIWebView)中級(jí)篇3
中最后遺留的3個(gè)問(wèn)題的第二個(gè)實(shí)際已經(jīng)有了答案, 對(duì)于WKWebView依然可以進(jìn)行攔截. 至于其它2個(gè)問(wèn)題, 我們將會(huì)在后面的文章陸續(xù)給出答案.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 前言 關(guān)于UIWebView的介紹,相信看過(guò)上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問(wèn)題,歡迎提問(wèn)。 本文是本系列...
    CoderLF閱讀 9,023評(píng)論 2 12
  • 雖然WKWebView是在Apple的WWDC 2014隨iOS 8和OS X 10.10出來(lái)的,是為了解決UIW...
    winann閱讀 136,290評(píng)論 195 641
  • 隨著H5技術(shù)的興起,在iOS開(kāi)發(fā)過(guò)程中,難免會(huì)遇到原生應(yīng)用需要和H5頁(yè)面交互的問(wèn)題。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,125評(píng)論 1 8
  • 前言 上一篇專(zhuān)門(mén)講解了WKWebView相關(guān)的所有類(lèi)、代理的所有API。前篇文章地址:http://blog.cs...
    iwolfox閱讀 1,123評(píng)論 1 1
  • WkWebView是IOS8中引入的新組件,蘋(píng)果將UIWebViewDelegate 與 UIWebView 重構(gòu)...
    陳宏偉閱讀 2,957評(píng)論 1 12