iOS/Swift + Objective-c

[iOS] WKWebView 자바스크립트 window.open, window.close 이벤트

안경 쓴 귀니 2020. 12. 16. 19:24
반응형

WKWebView에서 window.open(), window.close()이 호출된 경우 아래 메서드로 처리가 가능하다.

 

자바스크립트의 위 이벤트들을 받기 위해서는 WKNavigationDelegate, WKUIDelegate 프로토콜을 선언해야 한다.

@interface ViewController () <WKNavigationDelegate, WKUIDelegate> {

}
[wkWebView setUIDelegate:self];
[wkWebView setNavigationDelegate:self];

 

  • 팝업이 열리는 경우 (window.open 또는 target="_blank")

이 경우 일반적으로 canOpenURL if문 안에서 새로운 팝업 웹뷰를 생성하여 그 웹뷰를 리턴하여 화면을 팝업 화면을 출력한다.

별도 팝업이나 처리가 필요하지 않은 경우는 nil을 리턴하면 된다.

-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {    
    if (!navigationAction.targetFrame.isMainFrame) {
        if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) {
            // 팝업(새 창) 뜨는 경우 호출됨 (window.open 또는 target="_blank")
        }
    }
    return nil;
}

 

  • 팝업이 닫히는 경우 (window.close)

팝업이 닫히는 경우 아래 API가 호출된다.

-(void)webViewDidClose:(WKWebView *)webView {
    // 팝업 닫히는 경우 호출됨
}

 

  • 전체 소스코드
@interface ViewController () <WKNavigationDelegate, WKUIDelegate> {

}

- (void)viewDidLoad {
    [wkWebView setUIDelegate:self];
    [wkWebView setNavigationDelegate:self];
    
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    [self.wkWebView loadRequest:request];
}

-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {    
    if (!navigationAction.targetFrame.isMainFrame) {
        if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) {
            // 팝업(새 창) 뜨는 경우 호출됨 (window.open 또는 target="_blank")
        }
    }
    return nil;
}

-(void)webViewDidClose:(WKWebView *)webView {
    // 팝업 닫히는 경우 호출됨
}
반응형