반응형
WebView Settings 속성
webView.apply {
webChromeClient = WebChromeClient() // 크롬환경에 맞는 세팅을 해줌. 특히, 알람등을 받기위해서는 꼭 선언해주어야함 (alert같은 경우)
settings.apply {
javaScriptEnabled = true
javaScriptCanOpenWindowsAutomatically = false // window.open() 동작 허용
loadsImagesAutomatically = true // 웹뷰에서 앱에 등록되어있는 이미지 리소스를 사용해야 할 경우 자동으로 로드 여부
cacheMode = WebSettings.LOAD_NO_CACHE // LOAD_NO_CACHE -> 캐시 사용 x 네트워크로만 호출, LOAD_NORMAL -> 기본적인 모드로 캐시 사용, LOAD_DEFAULT -> 평소엔 LOAD_NORAML 캐시가 만료된 경우 네트워크를 사용, LOAD_CACHE_ONLY -> 캐시만 사용, LOAD_CACHE_ELSE_NETWORK 캐시가 없을 경우 네트워크 사용
domStorageEnabled = false // 로컬 스토리지 사용하여 dom 가져올 수 있도록 함
allowFileAccess = true // 웹뷰 내에서 파일 액세스 활성화 여부
userAgentString = "app"// 웹에서 해당속성을 통해 앱으로 인지 하도록
}
}
WebView내에 링크가 있을 경우 처리
webView.webViewClient = object: WebViewClient() {
// return 값은 현재 웹뷰에서 처리한다면 false
// API 24 이상
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest): Boolean {
val url = request.url.toString()
if(url.startsWith("sms:")) {
Intent(Intent.ACTION_SENDTO, Uri.parse(url)).also { startActivity(it) }
return true
} else {
// 새창 띄우기
Intent(Intent.ACTION_VIEW, Uri.parse(url)).also { startActivity(it) }
return true
// webView.loadUrl(url)
// return false
}
}
// API 24 미만
override fun shouldOverrideUrlLoading(view: WebView?, url: String): Boolean {
if(url.startsWith("sms:")) {
Intent(Intent.ACTION_SENDTO, Uri.parse(url)).also { startActivity(it) }
return true
} else {
// 새창 띄우기
Intent(Intent.ACTION_VIEW, Uri.parse(url)).also { startActivity(it) }
return true
// webView.loadUrl(url)
// return false
}
}
WebView 호출 함수
@SuppressLint("SetJavaScriptEnabled")
private fun initWebView() {
// 페이지 로딩 시작할 때 호출
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
}
// 페이지 로딩중 리소스 로드할 때마다 여러번 호출
override fun onLoadResource(view: WebView?, url: String?) {
webView.loadUrl("javascript:(function() { " + "document.getElementsByClassName('header')[0].style.display = 'none'; " + "document.getElementsByClassName('footer')[0].style.display = 'none'; " + "})()");
}
// 페이지 로딩이 끝났을 때 호출
override fun onPageFinished(view: WebView?, url: String?) {
}
}
WebView 에러처리
webView.webViewClient = object : WebViewClient() {
@RequiresApi(Build.VERSION_CODES.M)
override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError) {
super.onReceivedError(view, request, error)
when (error.errorCode) {
ERROR_AUTHENTICATION -> { } // 서버에서 사용자 인증 실패
ERROR_BAD_URL -> { } // 잘못된 URL
ERROR_CONNECT -> { } // 서버로 연결 실패
ERROR_FAILED_SSL_HANDSHAKE -> { } // SSL handshake 수행 실패
ERROR_FILE -> { } // 일반 파일 오류
ERROR_FILE_NOT_FOUND -> { } // 파일을 찾을 수 없습니다
ERROR_HOST_LOOKUP -> { } // 서버 또는 프록시 호스트 이름 조회 실패
ERROR_IO -> { } // 서버에서 읽거나 서버로 쓰기 실패
ERROR_PROXY_AUTHENTICATION -> { } // 프록시에서 사용자 인증 실패
ERROR_REDIRECT_LOOP -> { } // 너무 많은 리디렉션
ERROR_TIMEOUT -> { } // 연결 시간 초과
ERROR_TOO_MANY_REQUESTS -> { } // 페이지 로드중 너무 많은 요청 발생
ERROR_UNKNOWN -> { } // 일반 오류
ERROR_UNSUPPORTED_AUTH_SCHEME -> { } // 지원되지 않는 인증 체계
ERROR_UNSUPPORTED_SCHEME -> { } // URI가 지원되지 않는 방식
}
webView.clearHistory()
}
// API 23 미만
override fun onReceivedError(view: WebView?, errorCode: Int, description: String?, failingUrl: String?) {
super.onReceivedError(view, errorCode, description, failingUrl)
}
}
WebView 뒤로가기 처리
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack()
return true
}
return super.onKeyDown(keyCode, event);
}
참고 사이트
반응형