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 {
// 팝업 닫히는 경우 호출됨
}
반응형