ios webview window.open 우회하기

Kyu·2022년 6월 23일
1

ios

목록 보기
2/2
  • 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');
  • 해당코드에서 window.open 발생안하는 문제 발생
<a onclick="openWindow('/somePage')">
  • 근데 위와 같은 코드는 아까 말한대로 동작한다
<a href="#" id="id">참여</a>
  • 그래서 위와 같이 onclick 속성 없이 아래처럼 해봄
$.ajax({
                url: "/someApi",
                type: 'POST',
                data:
                    {
                        name: "kyu"                       },
                success: function (result) {
                        var string = "openWindow('" + result.data + "')";
                        $("#id").attr("onclick", string);
                        $("#id").trigger('click');
  • 동작하지 않는다. 문제는 a태그.
<a href="#" onclick="openWindow('/빈페이지')" id="id">참여</a>
  • 위와 같이 처음에 빈페이지를 띄워주면 동작한다
profile
TIL 남기는 공간입니다

0개의 댓글