티스토리 뷰

단순하게 WebView를 통하여 화면에 뿌려주는 것은 아주 쉽게 구현이 가능합니다.

웹과 통신을 하여서 조금 더 훌륭한 어플리케이션을 만드는것도 그렇게 어렵지는 않습니다.

한번 정리를 하고 지나가는 시간이 되었으면 해서 글을 적습니다. ^^


일단 이런 행동을 하기 위해서는 두가지가 필요합니다.


WebViewClient와 WebChromeClient 이렇게요


하나씩 해봅시다.


1. WebViewClient


공식 링크 : https://developer.android.com/reference/android/webkit/WebViewClient.html


상속을 받아서 사용을 하면 되고요.

내부의 function을 하나씩 채워 넣어 주면 됩니다.

필수가 아니며 사용을 할 부분들만 상속을 받아서 구체화 하여 주면 됩니다.


1
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?)
cs


웹페이지가 시작하려고 할 때 처음으로 호출되는 부분입니다. 이 의미는 main frame이 iframe에 페이지 로드를 하기 위해서 한번 호출되거나 frameset이 main frame에 이 function을 한번 호출하게 됩니다. ajax같은 기법으로 내부의 프레임을 변경하였을 경우에는 호출되지 않습니다.

1
override fun onPageFinished(view: WebView?, url: String?)
cs


페이지가 로드된것을 알려줍니다. main frame이 업데이트가 되었을 경우에 호출되며 리소스. 즉 이미지와 같은 부분들이 정확하게 업데이트가 되지 않았을 경우가 발생하게 됩니다.


1
override fun onLoadResource(view: WebView?, url: String?)
cs


페이지의 리소스를 로드할 경우에 호출됩니다. 페이지 내부의 리소스가 로드가 되면서 여러번 호출됩니다.


1
2
override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean)
 
cs


방문한 링크를 업데이트 할 경우에 호출됩니다.


1
2
3
4
override fun onFormResubmission(view: WebView, dontResend: Message, resend: Message) {
    resend.sendToTarget()
    super.onFormResubmission(view, dontResend, resend)
}
cs


POST 데이터가 포함된 페이지에서 POST 데이터를 다시 보내려고 하는 경우에 사용하면 되는 fuction. 기본적으로는 데이터를 재전송하지 않는것이 맞으나, 다시 페이지를 접속해야 하는 부분들이 생기거나 할 경우에는 이부분을 사용하여서 재전송을 할수 있도록 만들면 됩니다.


1
2
3
4
5
6
7
8
9
@Suppress("OverridingDeprecatedMember")
override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String?) {
    onReceivedError(view, failingUrl, errorCode)
}
 
@RequiresApi(api = Build.VERSION_CODES.M)
override fun onReceivedError(view: WebView, request: WebResourceRequest?, error: WebResourceError?) {
    onReceivedError(view, request?.url?.toString(), error?.errorCode)
}
cs


오류가 전달되는 부분입니다. 안들로이드 버전 M에서 새로 추가된 function이 있는데 중요하지 않게 공통으로 처리를 하고 싶다면 저처럼 function을 공통으로 만들어서 처리하면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch(errorCode) {
case ERROR_AUTHENTICATION: break;               // 서버에서 사용자 인증 실패
case ERROR_BAD_URL: break;                           // 잘못된 URL
case ERROR_CONNECT: break;                          // 서버로 연결 실패
case ERROR_FAILED_SSL_HANDSHAKE: break;    // SSL handshake 수행 실패
case ERROR_FILE: break;                                  // 일반 파일 오류
case ERROR_FILE_NOT_FOUND: break;               // 파일을 찾을 수 없습니다
case ERROR_HOST_LOOKUP: break;           // 서버 또는 프록시 호스트 이름 조회 실패
case ERROR_IO: break;                              // 서버에서 읽거나 서버로 쓰기 실패
case ERROR_PROXY_AUTHENTICATION: break;   // 프록시에서 사용자 인증 실패
case ERROR_REDIRECT_LOOP: break;               // 너무 많은 리디렉션
case ERROR_TIMEOUT: break;                          // 연결 시간 초과
case ERROR_TOO_MANY_REQUESTS: break;     // 페이지 로드중 너무 많은 요청 발생
case ERROR_UNKNOWN: break;                        // 일반 오류
case ERROR_UNSUPPORTED_AUTH_SCHEME: break; // 지원되지 않는 인증 체계
case ERROR_UNSUPPORTED_SCHEME: break;          // URI가 지원되지 않는 방식
}
cs


오류 값은 다음과 같습니다.

안드로이드 공식 사이트 가도 있습니다. 위쪽의 링크에요


1
override fun onUnhandledKeyEvent(view: WebView?, event: KeyEvent?)
cs


키 입력이 제한이 걸려있을 경우에 개발자에게 알려주는 역할을 합니다. 시스템 키를 제외한 shouldOverrideKeyEvent에서 제한을 걸어둔 경우나, 웹뷰의 제한으로 인한 키를 입력하지 못할 경우에 호출이 됩니다. 정말 특별하지 않으면 처리할 필요성은 없는듯


1
override fun shouldOverrideKeyEvent(view: WebView?, event: KeyEvent?): Boolean
cs


키 입력에 대한 처리를 할 경우에 사용합니다. 사용방법은 true를 호출하게 되면 동작을 webview에 위임하지 않는 경우로 생각하시면 됩니다. 내가 다 처리를 완료하였다는 의미의 true입니다. 그러므로 기본동작은 다 false로 동작합니다.


1
2
3
4
5
6
7
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean =
    onHandleUrlLoading(view, request.url.toString())
 
@Suppress("OverridingDeprecatedMember")
override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean =
    onHandleUrlLoading(view, url)
cs


url이 웹뷰에서 처리되려고 할 경우에, webview에서 노출하지 않고 처리할 수 있는 기회를 제공합니다. 예를 들면 특정 scheme로 호출이 될경우에는 Activity를 호출하여 주어야 하는데, PG사를 붙여서 사용할 경우에 이런 일들이 발생하게 되겠죠. 이러한 경우에 사용을 하면 됩니다.

마찬가지로 개발자가 처리를 완료하였다라는 개념으로 true를 호출하여 주면 webview에서 처리를 하지 않고, false를 호출하게 되면 webview에서 처리합니다. 그냥 냅두면 false를 호출합니다.


1
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError)
cs

웹뷰에서 ssl을 호출할 경우에 인증서가 만료되었거나, 변조된 인증서일 경우에 사용을 제한하기 위해서 사용합니다.


이전에는 그냥 proceed를 하게 되면 검수가 통과하였지만, 요즘은 그렇게 사용하면 바로 검출되어서 수정해서 다시 배포하라고 구글에서 메일이 옵니다.


처리하는 방법은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
val builder = AlertDialog.Builder(this@BaseWebViewActivity)
builder.setTitle(R.string.SSL_ERROR_DIALOG_TITLE)
builder.setMessage(R.string.SSL_ERROR_DIALOG_MESSAGE)
builder.setPositiveButton(android.R.string.ok) { _, _ ->
    handler?.proceed()
}
builder.setNegativeButton(android.R.string.cancel) { _, _ ->
    finish()
}
builder.setOnCancelListener { _ ->
    finish()
}
 
view.post {
    val dialog = builder.create()
    dialog.setCanceledOnTouchOutside(false)
    dialog.show()
}
cs


허용할 경우에만 사용할수 있도록 하여 줍니다.


중요한 부분들만 적은것이므로, 다른 부분들은 찾아보시기 바랍니다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함