[ios] WKWebView가 target =“_ blank”인 링크를 열지 않는 이유는 무엇입니까?

WKWebViewtarget="_blank"HTML <a href>태그 에 ‘새 창에서 열기’속성 이있는 링크는 열리지 않습니다 .



답변

내 해결책은 탐색을 취소하고 loadRequest :로 요청을 다시로드하는 것입니다. 이것은 현재 프레임에서 항상 새 창을 여는 UIWebView와 같은 유사한 동작이 될 것입니다.

WKUIDelegate델리게이트를 구현하고 _webview.uiDelegate. 그런 다음 구현하십시오.

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
  if (!navigationAction.targetFrame.isMainFrame) {
    [webView loadRequest:navigationAction.request];
  }

  return nil;
}


답변

@Cloud Xu의 대답이 정답입니다. 참고로 여기 Swift에 있습니다.

// this handles target=_blank links by opening them in the same view
func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! {
    if navigationAction.targetFrame == nil {
        webView.loadRequest(navigationAction.request)
    }
    return nil
}


답변

최신 버전의 Swift 4.2 이상을 사용하려면

import WebKit

WKUIDelegate로 수업 확장

WebView에 대한 위임 설정

self.webView.uiDelegate = self

프로토콜 방법 구현

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if navigationAction.targetFrame == nil {
        webView.load(navigationAction.request)
    }
    return nil
}


답변

자신을 WKNavigationDelegate 로 추가

_webView.navigationDelegate = self;

위임 콜백에서 다음 코드를 구현하십시오 .

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    //this is a 'new window action' (aka target="_blank") > open this URL externally. If we´re doing nothing here, WKWebView will also just do nothing. Maybe this will change in a later stage of the iOS 8 Beta
    if (!navigationAction.targetFrame) {
        NSURL *url = navigationAction.request.URL;
        UIApplication *app = [UIApplication sharedApplication];
        if ([app canOpenURL:url]) {
            [app openURL:url];
        }
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

추신 :이 코드는 STKWebKitViewControllerWKWebView 주변에 사용 가능한 UI를 래핑하는 내 작은 프로젝트 에서 가져온 것입니다.


답변

이미 WKWebView.navigationDelegate를 설정 한 경우

WKWebView.navigationDelegate = self;

다음을 구현하면됩니다.

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    BOOL shouldLoad = [self shouldStartLoadWithRequest:navigationAction.request]; // check the url if necessary

    if (shouldLoad && navigationAction.targetFrame == nil) {
        // WKWebView ignores links that open in new window
        [webView loadRequest:navigationAction.request];
    }

    // always pass a policy to the decisionHandler
    decisionHandler(shouldLoad ? WKNavigationActionPolicyAllow : WKNavigationActionPolicyCancel);
}

이렇게하면 WKUIDelegate 메서드를 구현할 필요가 없습니다.


답변

이러한 솔루션 중 어느 것도 나를 위해 일하지 않았으며 다음과 같이 문제를 해결했습니다.

1) WKUIDelegate 구현

@interface ViewController () <WKNavigationDelegate, WKUIDelegate>

2) wkWebview의 UIDelegate 델리게이트 설정

self.wkWebview.UIDelegate = self;

3) createWebViewWithConfiguration 메서드 구현

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

if (!navigationAction.targetFrame.isMainFrame) {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [[UIApplication sharedApplication] openURL:[navigationAction.request URL]];
}
return nil;  }


답변

Cloud xu의 대답은 내 문제를 해결합니다.

누군가 동등한 Swift (4.x / 5.0) 버전이 필요한 경우 다음과 같습니다.

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if let frame = navigationAction.targetFrame,
        frame.isMainFrame {
        return nil
    }
    // for _blank target or non-mainFrame target
    webView.load(navigationAction.request)
    return nil
}

물론 webView.uiDelegate먼저 설정해야합니다 .