본문 바로가기

안드로이드 기술 공유

[코틀린] 하이브리드 앱을 위한 안드로이드 웹뷰(WebView) 완벽 셋팅!

하이브리드 앱을 위해 현재 제가 사용하고 있는 안드로이드 웹뷰(WebView)의 주요 셋팅을 공유하고자 합니다!

저는 웹뷰를 공통으로 사용하기 위해 "CommonWebView"라는 이름으로 커스텀 웹뷰를 만들어서 사용하고 있습니다. ^^ 

바로 보시죠!

class CommonWebView(context: Context, attrs: AttributeSet?, defStyle: Int) : WebView(context, attrs, defStyle) {
    constructor(context: Context) : this(context, null)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)

    init {
        with(settings) {
            userAgentString += "Android_inApp" //UserAgent 설정
            javaScriptEnabled = true //자바스크립트 사용 설정
            javaScriptCanOpenWindowsAutomatically = true //window.open() 동작 설정
            useWideViewPort = true //wide viewport 사용 설정
            loadWithOverviewMode = true //컨텐츠가 웹뷰보다 클 때, 스크린 크기에 맞추기
            builtInZoomControls = false //줌 컨트롤 사용 여부 설정
            cacheMode = WebSettings.LOAD_NO_CACHE //캐시 설정
            setAppCacheEnabled(false) //앱 내부 캐시 사용 여부 설정
            domStorageEnabled = true //로컬 스토리지, 세션 스토리지 사용 여부 설정
            allowFileAccess = true //파일 접근 허용 설정
            defaultTextEncodingName = "UTF-8" //인코딩 설정
            setSupportMultipleWindows(true) //멀티윈도우 지원 여부 설정
            databaseEnabled = true //Database Storage API 사용 여부 설정

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW //https, http 호환 여부(https에서 http컨텐츠도 보여질수 있도록 함)
            }
        }

        webViewClient = CommonWebViewClient()
        webChromeClient = WebChromeClient()
    }

    private var mWebViewListener: WebViewListener? = null

    fun setWebViewListener(webViewListener: WebViewListener) {
        mWebViewListener = webViewListener
    }

    inner class CommonWebViewClient : WebViewClient() {
        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            super.onPageStarted(view, url, favicon)
            mWebViewListener?.onPageStarted(url, favicon)
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            mWebViewListener?.onPageFinished(url)
            super.onPageFinished(view, url)
        }

        override fun onLoadResource(view: WebView?, url: String?) {
            super.onLoadResource(view, url)
            mWebViewListener?.onLoadResource(url)
        }

        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            mWebViewListener?.shouldOverrideUrlLoading(request)
            return super.shouldOverrideUrlLoading(view, request)
        }

        override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) {
            super.onReceivedError(view, request, error)
            mWebViewListener?.onReceivedError(request, error)
        }
    }

    interface WebViewListener {
        fun onPageStarted(url: String?, favicon: Bitmap?)
        fun onPageFinished(url: String?)
        fun onLoadResource(url: String?)
        fun shouldOverrideUrlLoading(request: WebResourceRequest?)
        fun onReceivedError(request: WebResourceRequest?, error: WebResourceError?)

    }
}

잊지 않으셨죠?

퍼미션 추가

AndroidManifest.xml에 인터넷 사용을 위한 "android.permission.INTERNET" 퍼미션을 추가해주세요!

 

<uses-permission android:name="android.permission.INTERNET"/>