본문 바로가기
카테고리 없음

[kotlin/안드로이드] 코틀린 웹뷰 설정 WebViewClient / WebChromeClient 차이점

by 응디잉 2023. 1. 4.

 

안드로이드 웹앱 개발시 저것또한 복붙으로 작성했는데 설정차이가 좀 있었다. 

어느동작이 안됐을때 어디서 잘못된건지 쵸큼은...쵸큼은...알 수 있어졌....을걸? 

 

 

 

  • WebChromeClient로 전체 화면 지원 사용 설정. 이 클래스는 WebView가 창을 만들거나 닫고 자바스크립트 대화상자를 사용자에게 전송하는 등 호스트 앱의 UI를 변경하기 위한 권한을 필요로 할 때도 호출됩니다. 이 같은 상황에서 디버깅하는 방법을 자세히 알아보려면 웹 앱 디버깅을 참조하세요.
  • WebViewClient를 사용한 탐색 오류 또는 양식 제출 오류 등 콘텐츠 렌더링에 영향을 미치는 이벤트 처리. 이 서브클래스를 사용하여 URL 로드를 가로챌 수도 있습니다.
  • WebSettings를 수정하여 자바스크립트 사용 설정.

 

 

WebViewClient / WebChromeClient 

비슷해보이지만 그냥 단순하게 생각하기로 

웹 뷰 라고 하는건 말그대로 웹페이지를 보여주는 뷰를 제어하는거고 

웹 크롬! 이들어간건 웹에서 앱의 동작을 제어하려는건가보다 하는 것으로 이해하기로했다. 

틀려도 그냥 난 이렇게 이해할거당 멜렁멜롱 아몰랑 

 

 

    val myWebView: WebView = findViewById(R.id.webview)
    myWebView.webViewClient = WebViewClient()

-> 웹페이지에서 url 이 로딩 될때 사용자가 클릭한 링크를 열려면 setWebViewClient()를 사용하여 WebView WebViewClient를 제공합니다.

 

 

그런데 가끔 url을 임의적으로 이동 시켜야 할 순간이 있다. 

예를 들어 다른 앱을 실행하려고 링크를 넘겼을때 앱이없는경우 플레이스토어로 이동해야 하거나, 일부 url 이 로드되었을 경우 토스트메시지를 띄운다거나 하는 등의 가로채기 

그런경우 shouldOverrideUrlLoading 함수를 이용하여 url 을 가로챌 수 있다. 

상황에 맞게 커스텀 가능하당

 

 

    private class MyWebViewClient : WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            if (Uri.parse(url).host == "www.example.com") {
                // url이 일치하는 경우 메서드는 URL 로드를 재정의하지 않도록 false를 반환
                return false
            }
            // 일치하지 않는경우 기본 웹브라우저를 통하여 url 로드하도록 동작
            Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
                startActivity(this)
            }
            return true
        }
    }

->  Intent.ACTION_VIEW 를 사용하여 기본 웹브라우저로 넘겨 주고 있음. 

 

 

 

 

웹뷰 뒤로가기

 

안드로이드 기기는 뒤로가기 버튼이 있당 (난 아이폰쓰는데) 

그래서 뒤로가기 눌렀을 때 뒤의 웹페이지가 있는지 탐색을 한 후에 뒤로가기 처리를 해주고 있음 

히스토리 관리도 가능! 

가장 간단하개 canGoBack 함수를 사용

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        // 뒤로가기 버튼을 눌렀을때 히스토리가 있다면 뒤로 가세용 
        if (keyCode == KeyEvent.KEYCODE_BACK && myWebView.canGoBack()) {
            myWebView.goBack()
            return true
        }
        // 만약 히스토리가 없는 경우 아무 동작 하지 않음
        return super.onKeyDown(keyCode, event)
    }

 

뒤로가기두번 앱 종료 

히스토리를 다 지나고 지나고 첫페이지로 왔을때 이제 앱 꺼졍!

방법은 다양하지만 예전부터 쓰던 소스 복붙


/**
 * 키패드 누름 시간 변수
 */
private var backKeyPressedTime: Long = 0

/**
 * 앱 종료 인터벌 변수
 */
private val QUIT_INTERVAL: Int = 2000
/**
 * 백버튼 이벤트 처리
 */
override fun onBackPressed() {
    if(mWebView.canGoBack()){
        mWebView.goBack()
    }else{
        if (System.currentTimeMillis() > backKeyPressedTime + QUIT_INTERVAL) {
            backKeyPressedTime = System.currentTimeMillis()
            Toast.makeText(this, "한번 더 누르시면 종료 됩니다.", Toast.LENGTH_LONG).show()
            return
        }
        if (System.currentTimeMillis() <= backKeyPressedTime + QUIT_INTERVAL) {
            finishAffinity()
        }
    }
}

 

canGoBack 할 수 있다면 고백하지만 더이상 백으로 갈 수 없는 경우 종료 되는 상황 

약간의 시간차를 두고 동작하게끔 인터벌 변수를 따로 사용 

 

 

웹뷰 히스토리 알아내기

내가 이동했던 히스토리를 알아보기 위해. 전페이지가 뭐였는지 히스토리를 확인 할 수가 있다 

웹에서 방문기록 확인하는 것 처럼

 

   

var historyList = webView.copyBackForwardList()
var backTargetUrl = historyList.getItemAtIndex(historyList.currentIndex() - 1).getUrl()

 

index 를 활용하여 전페이지 전전페이지 등을 확인 할 수 있다. 

만약 현재 떠있는 페이지를 알아내고 싶다면 뒤에 상수를 지우면된다. 

currentIndex() 까지만! 

가끔 같은 페이지가 중복으로 로드되길래 히스토리 알아내서 같은 주소는 두번 로드되지 않도록 막아놨었음 

 

댓글