안드로이드 웹뷰 자식창 호출

Kyu·2022년 6월 10일
0

webview

목록 보기
1/1

안녕하세요.
안드로이드 웹뷰 관련 질문 있습니다..

문제

안드로이드 웹뷰에서 자식창에서 부모창을 참조하지 못하는 문제가 습니다
처음 자식창을 오픈했을때는 부모창을 잘 참조를 하는데,
해당 페이지에서 다른 페이지(휴대폰인증)로 이동했다가 다시 외부에서 저희 서버 콜백url호출하여 해당 자식 페이지로 왔을때 참조를 못하고 있습니다

그리고 웹 브라우저에서는 문제없이 잘 참조하는데 안드로이드 웹뷰에서만 참조하지 못하고 있어요.
간략히 다시 정리를 하자면,

  1. 부모창에서 자식창 오픈
    --> 이 경우에는 자식창에서 부모창을 참조가 가능합니다
  2. 자식창에서 다른 외부 페이지(휴대폰인증)로 이동
  3. 외부페이지에서 자식창 페이지로 다시 이동
    --> 이 부분에서 아래와 같은 에러가 발생합니다

"Uncaught TypeError: Cannot read properties of null (reading 'document')"

시도

  1. 외주 앱개발자님이 opener 문법자체가 틀리신거 같다고 하여 자바스크립트로 대체해 시도해봤습니다.
  2. 원래 jQuery를 사용했는데 jQuery 불러오는데에 문제가 있을 수도 있다고 생각하여 전부 자바스크립트 코드로 짜서 시도해봤습니다

자식창의 자바스크립트 코드는 아래와 같습니다

<script th:inline="javascript">
    document.addEventListener("DOMContentLoaded", function(){
        console.log("자식창에서 opener.document");
        console.log(opener.document); // document 호출 에러발생
        opener.document.getElementById('encInfo').value = [[${encPriInfo}]];
        opener.document.getElementById('phoneOrIpin').value = 'phone';
        opener.document.getElementById('authFlag').value = '1';
        var trigger = opener.document.getElementById('authFlag');
        var customEvent = document.createEvent('Event');
        customEvent.initEvent('change', false, true);
        trigger.dispatchEvent(customEvent);
        // 아래는 외주 앱개발자님이 틀린거 같다고 한 코드
        // opener.$('body').find("#encInfo").val(encPriInfo);
        // opener.$('body').find("#phoneOrIpin").val('phone');
        // opener.$('body').find("#authFlag").val('1').trigger('change');
    });
</script>

웹뷰에서는 자바스크립트 처리를 위하여 아래처럼 Setting이 되어있는 상태입니다

WebView subView = new WebView(view.getContext());
subView.getSettings().setJavaScriptEnabled(true);
subView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
subView.getSettings().setDomStorageEnabled(true);
subView.getSettings().setSupportMultipleWindows(true);
subView.getSettings().setUseWideViewPort(true);
subView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
subView.getSettings().setLoadWithOverviewMode(true);

onCloseWindow 메소드는 아래와 같이 되어있습니다.

          /* ...MainActivity 코드생략... */
            @Override
            public void onCloseWindow(WebView window) {
                AppUtil.log(MainActivity.this, "onCloseWindow2222");
                window.setVisibility(View.GONE);
                window.destroy();
                super.onCloseWindow(window);
            }
            /* ... */

다시 정리하자면,

  1. 웹뷰에서 처음에 자식창을 열면 부모창을 잘 참조하지만 다른 페이지로 이동후에 다시 호출이 되었을때 부모창을 호출하지 못하는 문제가 발생합니다
  2. 크롬, 웨일 등 크로미움 기반 웹브라우저에서 문제없이 잘 작동하고, 안드로이드 휴대폰 기본 내장 삼성 인터넷 브라우저에서도 문제없이 잘 작동합니다만 앱에서만 작동하지 않습니다.
    1주일째 이 부분을 해결하지 못하고있어 생각나시는 아주 조그마한 의견이라도 주신다면 정말 감사하겠습니다..ㅠㅠ
profile
TIL 남기는 공간입니다

1개의 댓글

comment-user-thumbnail
2022년 6월 10일

문제 해결했습니다. 너무 기쁩네요 물어보길 정말 잘했어요..ㅠㅠ

문제 원인
1. 원래 다른 호스트로 navigate하면 opener가 날라갸아하는뎅...브라우저들을 믿으면 안돼요. 아무리 표준이 있어도 다들 지들 맘대로 만드는데(ㅋㅋ)
2. 따라서 원래 웹뷰에서처럼 다른 호스트이므로 다른 웹브라우저들도 opener가 날라가야하는게 맞다, null이 맞다

문제 해결
우회적인 방법을 썼다. 안드로이드와 js사이에 링크http://rapidprogrammer.com/android-how-to-call-native-java-methods-from-webview-javascript 표현을 빌리자면 bridge/glue 를 만들어준다.

원래

  • 부모창->자식창->부모창
    bridge/glue
  • 부모창->자식창->안드로이드->부모창

한계

  • 보다시피 쓸때없이 안드로이드가 중간에 추가됨
  • 유지보수 짜증

그래서 추천하는 방법은?
1. 같은 호스트로 유지하도록 코드 변경

기타 방법들
1. localstorage 이용
2. 키값생성하고 클라에서 지속적 polling

답글 달기