본문 바로가기

안드로이드/오류해결

Webview내 window.open 대응하기 ( 새창 열기 에러 )

반응형

웹뷰 연동시 새창을 여는 버튼이 작동하지 않아 웹 소스를 확인해보니 window.open으로 되어 있었습니다. 확인 해보니 WebChromeClient()의 onCreateWindow 메소드를 오버라이드해서 처리해야 합니다.


	    var dialog: Dialog? = null

	webChromeClient = object : WebChromeClient() {
            override fun onCloseWindow(window: WebView?) {
                super.onCloseWindow(window)

                dialog?.dismiss()
                windowWebview?.destroy()
                window?.destroy()
            }

            override fun onCreateWindow(
                view: WebView?,
                isDialog: Boolean,
                isUserGesture: Boolean,
                resultMsg: Message?
            ): Boolean {

                var webview = WebView(activity)
                webview.settings.run {
                    javaScriptEnabled = true                        // 자바 스크립트 사용 여부
                    setSupportMultipleWindows(true)                 //여러개의 윈도우 사용 여부
                    javaScriptCanOpenWindowsAutomatically = true
                }

                dialog = Dialog(activity).apply {

                    setContentView(webview)
                    var params = window?.attributes?.apply {
                        width = ViewGroup.LayoutParams.MATCH_PARENT
                        height = ViewGroup.LayoutParams.MATCH_PARENT
                    }

                    window?.attributes = params
                }

                webview.webChromeClient = object : WebChromeClient() {

                    override fun onCloseWindow(window: WebView?) {
                        dialog?.dismiss()
                        webview.destroy()
                        window?.destroy()
                    }
                }
                
                dialog?.setOnDismissListener {
                    webview.destroy()
                }
                
                dialog?.show()

                (resultMsg?.obj as WebView.WebViewTransport).webView = windowWebview
                resultMsg?.sendToTarget()

                return true
            }
        }

dialog에 웹뷰를 넣어서 로드하는 예제 코드들이 많은데, 그럴때 발생하는 문제가 있습니다. 

백버튼을 이용해서 dialog를 닫았을 경우 'onCreateView'에서 생성한 웹뷰가 사라지지 않아 기존 웹뷰 버튼이 작동하지 않는 이슈가 있습니다. 그렇기 때문에 dialog가 닫힐때 생성된 웹뷰의 destory() 를 호출해야 합니다.

 

저의 경우는 본인 인증 하는 창을 새로 띄우고, 인증을 완료 했을때 기존에 있던 웹뷰를 새로고침 하는 플로우 였습니다. 

안드로이드에서는 위처럼만 작업해도 문제 없이 진행 됐습니다. 

 

그리고 웹뷰 연동 후 디버깅하는 과정에서 문제가 있으면 주로 설정 문제이거나 웹쪽 문제일 경우가 많은데 두 플랫폼을 모두 알고 있는 개발자가 아니면 새로운 문제에 봉착했을때 헤쳐나가기 어렵습니다. 그렇기 때문에 웹 개발자와 많이 소통하는게 중요합니다.

위 코드에 문제나 오류등이 있을시 댓글로 남겨주시면 적극 반영하겠습니다. 

 

반응형