[Jetpack WebView] shouldOverrideUrlLoading vs shouldInterceptRequest 완벽 정리

2025. 3. 20. 17:09Android/Jetpack

728x90
반응형

Android WebView를 사용할 때, 두 가지 중요한 메서드가 있다.

  • shouldOverrideUrlLoading
  • shouldInterceptRequest

이 두 가지를 제대로 이해하면, WebView에서 원하는 동작을 제어하고, 네트워크 요청을 최적화 할 수 있다.

하지만, 두 메서드의 차이를 정확히 모르면 잘못된 방식으로 WebView를 컨트롤 하게 될 수도 있다.

 


 

1. shouldOverrideUrlLoading란?

“ 웹뷰가 URL을 어떻게 처리할지 결정하는 메서드 ”

(1) 역할

  • WebView가 새로운 URL을 로드할 때, 이를 가로채서 직접 처리할지 결정한다.
  • 특정 URL을 WebView에서 로드할지, 외부 브라우저에서 열지, 차단할지 등을 제어한다.

(2) 예시

  • 특정 링크만 Webview에서 호출하고, 나머지는 브라우저로 열기
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
    val url = request.url.toString()

    return if (url.startsWith("<https://myapp.com>")) {
        false // WebView에서 그대로 로드
    } else {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
        view.context.startActivity(intent) // 외부 브라우저에서 열기
        true // WebView에서 로드하지 않음
    }
}
  • 광고 사이트나 악성 사이트를 WebView에서 차단하기
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
    val blockedUrls = listOf("<https://ads.com>", "<https://malware-site.com>")

    return if (blockedUrls.any { request.url.toString().contains(it) }) {
        true // 차단 (WebView에서 로드하지 않음)
    } else {
        false // 정상적으로 로드
    }
}

 

2. shouldInterceptRequest란?

“ 웹뷰의 네트워크 요청을 가로채서 직접 응답을 생성하는 메서드 “

(1) 역할

  • WebView가 네트워크 요청을 보내기 전에 요청을 가로채서, 변경하거나 직접 응답을 생성할 수 있다.
  • 특정 리소스를 차단하거나, 캐시된 데이터를 활용하는 등의 최적화가 가능하다.

(2) 예시

  • 특정 도메인 관련 요청을 차단하여 표시하지 않도록 설정
override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
    val url = request.url.toString()

    return if (url.contains("ads.com")) {
        // 광고 차단 (빈 응답 반환)
        WebResourceResponse("text/plain", "utf-8", ByteArrayInputStream("".toByteArray()))
    } else {
        null // 정상적인 요청은 그대로 진행
    }
}
  • 웹사이트에서 요청하는 이미지가 이미 앱 내부 캐시에 있다면, 바로 로드하도록 개선
override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
    val url = request.url.toString()

    if (url.endsWith(".png") || url.endsWith(".jpg")) {
        val cachedFile = File(view.context.cacheDir, url.substringAfterLast("/"))
        if (cachedFile.exists()) {
            return WebResourceResponse(
                "image/png", "utf-8", FileInputStream(cachedFile)
            ) // 캐시에서 이미지 로드
        }
    }
    return null // 기본 요청 진행
}

 

3. 핵심 정리

✔ shouldOverrideUrlLoading은 웹이 앱한테 요청하는 걸 앱이 통제

즉, 웹이 앱한테 “이 페이지 열어~” 라고 지시를 내리면 앱은 “음… 이건 웹 브라우저로 열래!” 하는 느낌이다.

✔ shouldInterceptRequest은 웹이 네트워크 연결하기 전에 앱이 가로채버림

웹이 네이버 페이지를 열고, 거기에 있는 이미지를 서버를 통해 로드하려고 하는데

앱이 “어?! 나 그 사진 있는데!!!! 네트워크 통신하지 말고 내 사진 가져다 써!!!!” 하면서

리소스 파일을 전달하는 방식.

즉, 웹이 서버랑 통신하기 전에 앱이 가로채버리는 것.

 

728x90
반응형