- ios webview나 safari는 기본적으로 window.open 이 막혀있음
먼저 ios webview에서 팝업을 사용하려면 아래처럼 설정해줘야한다
// window.open()으로 열리는 새창
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
let getSchemeStr = webView.url?.scheme
//뷰를 생성하는 경우
let frame = UIScreen.main.bounds
//파라미터로 받은 configuration
createWebView = WKWebView(frame: frame, configuration: configuration)
//오토레이아웃 처리
createWebView!.autoresizingMask = [.flexibleWidth, .flexibleHeight]
createWebView!.navigationDelegate = self
createWebView!.uiDelegate = self
createWebView!.tag = 100
WebViewContentLayout.addSubview(createWebView!)
return createWebView!
}
그러면 동작한다.
그럼에도 불구하고 동작하지 않을 때가 있다.
정확한 원인은 모르겠지만 사파리에서도 똑같은 증상이 발생한다.
둘다 애플이 만든거니까 똑같은 정책에따라 막혀있을 거라 생각하고
사파리에서 문제 해결하는 방법을 찾아가며 해보았다
https://stackoverflow.com/questions/20696041/window-openurl-blank-not-working-on-imac-safari
https://milooy.github.io/dev/avoid-blocking-popup-in-safari/
위 두 링크를 보면 window.open(undefined)로 빈 창을 열고
해당 빈창에서 페이지를 navigate 시키는 방법을 소개하고 있다
보통 검색해보면 전부 그런 방식으로 하도록 되어있는데
나같은 경우엔 아예 window.open()이 동작하지가 않았다.
그런데 이상한점은 a태그를 이용해서 이런식으로 주면
열린다.
아마 저것도 내부적으로 뜯어보면 사파리나 ios웹뷰에서 막아놓은걸 피해서 작동시키도록
한거 같긴한데 중요한건 동작한다는 사실이다.
그래서 아래와 같이해본다
$.ajax({
url: "/someApi",
type: 'POST',
data:
{
id: id
},
success: function (result) {
window.open(result.data, '', 'popup');
<a onclick="openWindow('/somePage')">
<a href="#" id="id">참여</a>
$.ajax({
url: "/someApi",
type: 'POST',
data:
{
name: "kyu" },
success: function (result) {
var string = "openWindow('" + result.data + "')";
$("#id").attr("onclick", string);
$("#id").trigger('click');
<a href="#" onclick="openWindow('/빈페이지')" id="id">참여</a>