[Kotlin] WebView로 페이지 띄우기 (feat. 세팅속성, 암시적 인텐트로 URL실행, 버그관련 )

han·2021년 7월 13일
0
post-custom-banner

안드로이드에서 웹뷰를 이용해서 url을 불러오는것에 대해 알아보자.

웹뷰 연동하기

1. 매니페스트에서 권한 설정해주기

2. xml 작성

3. 코드 작성 부분

(1) 전체 코드 부분.

(2) 간단한 웹뷰 연동 방법

    webView.apply {
        webViewClient = WebViewClient() 
        // 페이지 컨트롤을 위한 기본적인 함수, 다양한 요청, 알림을 수신하는 기능
        settings.javaScriptEnabled = true // 자바스크립트 허용
    }
    webView.loadUrl("https://www.naver.co.kr/") // url 주소 가져오기

간단하게 3~4줄 만으로도 웹뷰를 연동 할 수 있지만 여러가지 제약 사항들이 생긴다.

(3) WebView 세팅 속성들

     val webView = findViewById<WebView>(R.id.webview) // 웹뷰 셋팅
    webView.apply {
        webViewClient = WebViewClient() // 하이퍼링크 클릭시 새창 띄우기 방지
        webChromeClient = WebChromeClient() // 크롬환경에 맞는 세팅을 해줌. 특히, 알람등을 받기위해서는 꼭 선언해주어야함 (alert같은 경우)
        settings.javaScriptEnabled = true // 자바스크립트 허용
        settings.javaScriptCanOpenWindowsAutomatically = false
        // 팝업창을 띄울 경우가 있는데, 해당 속성을 추가해야 window.open() 이 제대로 작동 , 자바스크립트 새창도 띄우기 허용여부
        settings.setSupportMultipleWindows(false) // 새창 띄우기 허용 여부 (멀티뷰)
        settings.loadsImagesAutomatically = true // 웹뷰가 앱에 등록되어 있는 이미지 리소스를 자동으로 로드하도록 설정하는 속성
        settings.useWideViewPort = true // 화면 사이즈 맞추기 허용 여부
        settings.loadWithOverviewMode = true // 메타태그 허용 여부
        settings.setSupportZoom(true) // 화면 줌 허용여부
        settings.builtInZoomControls = false // 화면 확대 축소 허용여부
        settings.displayZoomControls = false // 줌 컨트롤 없애기.
        settings.cacheMode = WebSettings.LOAD_NO_CACHE // 웹뷰의 캐시 모드를 설정하는 속성으로써 5가지 모드
        /*
        (1) LOAD_CACHE_ELSE_NETWORK 기간이 만료돼 캐시를 사용할 수 없을 경우 네트워크를 사용합니다.
        (2) LOAD_CACHE_ONLY 네트워크를 사용하지 않고 캐시를 불러옵니다.
        (3) LOAD_DEFAULT 기본적인 모드로 캐시를 사용하고 만료된 경우 네트워크를 사용해 로드합니다.
        (4) LOAD_NORMAL 기본적인 모드로 캐시를 사용합니다.
        (5) LOAD_NO_CACHE 캐시모드를 사용하지 않고 네트워크를 통해서만 호출합니다.
         */
        settings.setAppCacheEnabled(false) // 앱 내부 캐시 사용 여부 설정 (Deprecated )
        settings.domStorageEnabled = true // 로컬 스토리지 사용 여부를 설정하는 속성으로 팝업창등을 '하루동안 보지 않기' 기능 사용에 필요
        settings.allowContentAccess // 웹뷰 내에서 파일 액세스 활성화 여부
        settings.userAgentString = "app" // 웹에서 해당 속성을 통해 앱에서 띄운 웹뷰로 인지 할 수 있도록 합니다.
        settings.defaultTextEncodingName = "UTF-8" // 인코딩 설정
        settings.databaseEnabled = true //Database Storage API 사용 여부 설정
    }
    webView.loadUrl("https://www.naver.co.kr/") // url 주소 가져오기
}

암시적 인텐트로 URL 실행

암시적 인텐트 URL을 설명하기 전에 간단하게 암시적인 무엇인지, 명시적이 무엇인지 설명하려고 한다.

  • 명시적 인텐트

    위와 같은 인텐트를 명시적이라고 하는데, 의도가 명확하고 인텐트에 Webview::class.java와 같이 액티비티를 실행하라고 명확하게 의미를 전달한다는 것이 명시적 인텐트이다.

  • 암시적 인텐트

    암시적 인텐트란 위와 같이 명확하게 의미를 전달하는 것이 아닌 ACTION_VIEW나 ACTION_DIAL같은 액션을 이용해서 인텐트를 처리할 수 있는 액티비티를 찾아서 실행해 준다.

추가적으로, 버그 관련해서 해결하게 된 상황들 정리

  • 웹뷰로 로그인이 안되는 상황

    로그인을 눌럿을때 나타나는 메시지를 보니,
    "TypeError: Cannot read property 'message' of undefined" 라는 내용이 나왔다.
    그래서 검색해보니 웹 페이지의 js가 실행 중일 떄 페이지가 아직 로드되지를 않아서 페이지 요소를 찾을수가 없다고 한다.
    즉, 로그인에 필요한 데이터들을 못가져온다는 말인 것 같다.

    그러면 이 문제를 안드로이드쪽에서 해결하려면 어떻게 해야 할까?

    해결방법은 브라우저의 Doom 프로토타입 저장을 이용하는데, 페이지 요소의 DOM 모델에 데이터를 저장해서 js가 이 메서드를 호출함으로써 데이터를 가져오는 작업으로 가능하다고 한다.

    따라서 webview쪽에서 설정을 추가 해주면 되는데,

    settings.domStorageEnabled = true // 을 추가함으로써 해결이 가능하다.

profile
개인 공부 및 기록겸 벨로그 시작
post-custom-banner

0개의 댓글