마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 웹뷰 부모-자식창 관련 질문

0 추천

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

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

그리고 웹 브라우저에서는 문제없이 잘 참조하는데 안드로이드 웹뷰에서만 참조하지 못하고 있어요.

간략히 다시 정리를 하자면,

1. 부모창에서 자식창 오픈
--> 이 경우에는 자식창에서 부모창을 참조가 가능합니다
2. 자식창에서 다른 외부 페이지(휴대폰인증)로 이동
3. 외부페이지에서 자식창 페이지로 다시 이동
--> 이 부분에서 아래와 같은 에러가 발생합니다
`"Uncaught TypeError: Cannot read properties of null (reading 'document')"`

시도

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

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

```javascript
<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이 되어있는 상태입니다

```java
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 메소드는 아래와 같이 되어있습니다.

```java

          /* ...MainActivity 코드생략... */

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

            /* ... */
```

다시 정리하자면,

1. 웹뷰에서 처음에 자식창을 열면 부모창을 잘 참조하지만 다른 페이지로 이동후에 다시 호출이 되었을때 부모창을 호출하지 못하는 문제가 발생합니다

2. 크롬, 웨일 등 크로미움 기반 웹브라우저에서 문제없이 잘 작동하고, 안드로이드 휴대폰 기본 내장 삼성 인터넷 브라우저에서도 문제없이 잘 작동합니다만 앱에서만 작동하지 않습니다.

 

1주일째 이 부분을 해결하지 못하고있어 생각나시는 아주 조그마한 의견이라도 주신다면 정말 감사하겠습니다..ㅠㅠ

김연우 (120 포인트) 님이 2022년 6월 9일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...