본문 바로가기

Android/Knowhow

Android nougat(7+) webview에 컨텐츠가 출력되지 않을때

안드로이드 누가 기기에서 기존에 사용하던 웹뷰를 실행해보았다.

웹뷰에 컨텐츠가 출력되지 않는다.





안드로이드 개발자 문서에서는 누가 버전 웹뷰의 변경사항에 대해 말하고 있지만, 정작 해결을 어떻게 하는지는 하나도 모르겠다.


https://developer.android.com/about/versions/nougat/android-7.0.html#webview




'android nougat 7 webview'로 구글링해서 얻은 결과이다.

웹뷰에 WebViewClient를 설정해주고 shouldOverrideUrlLoading()에 return 값을 true로 해줘야한다.


http://stackoverflow.com/questions/42367358/webview-on-android-7-0-doesnt-render-page






WebViewClient는 무엇이고, 비슷하게 생긴 WebChromeClient는 무엇일까?


1. WebViewClient (Handling Page Navigation)


컨텐츠를 렌더링할 때 호출된다. 로딩중인 url을 가로챌 수 있다. 


유저가 WebView에 로드된 웹페이지의 링크를 클릭했을때, 기본 동작은 url을 다루는 앱을 실행하는것이다.

보통, 기본 웹브라우저는 url을 열고 로드한다. 그러나, WebViewClient를 사용하면 WebView 안에서 링크를 열도록 override할 수 있다.

클릭한 링크를 로드해서 더 다양한 control을 하고싶다면, shouldOverrideUrlLoading() 메서드를 override해서 커스텀한 WebViewClient를 생성하면 된다. 그렇게 설정했을때 유저가 링크를 클릭하면 시스템은 shouldOverrideUrlLoading()을 호출한다.


2. WebViewClient.shouldOverridingUrlLoading()


새로운 url이 현재 WebView에 로드되려고 할 때, host 앱에게 control을 take over할 기회를 준다.

WebViewClient가 제공되어지지 않으면, 기본으로 WebView가 Activity Manager에게 그 url을 위한 적절한 핸들러를 선택하라고 요청할것이다.

WebViewClient가 제공되면, 

(1) return true: host 앱이 그 url을 다룬다.

(2) return false: 현재 WebView가 그 url을 다룬다.



주의사항:

- 이 메서드는 POST 방식의 request에 호출되지 않는다. -> 즉, WebView.loadData() 메서드를 사용하지 말고 WebView.loadUrl() 메서드를 사용해야 한다.

- 이 메서드는 .......? (This method is also called for subframes with non-http schemes, thus it is strongly disadvised to unconditionally call loadUrl(String) with the request's url from inside the method and then return true, as this will make WebView to attempt loading a non-http url, and thus fail.)




3. WebChromeClient


프로그레스 업데이트나 자바스크립트 경고 팝업같은 브라우저의 UI 이슈들이 영향을 줄 때 호출된다.

여러개의 창을 연다거나 원하는 수단이 무엇이든지 렌더링할 수 있다.






=====================================================================================


게시판에서 게시물을 웹뷰로 보여주고 있다.

서버에서 받아온 게시물 관련 json에는 게시물 객체가 String이어서, POST 방식인 WebView.loadData() 메서드를 사용한다.

하지만 POST 방식의 request를 사용하면 WebViewClient.shouldOverridingUrlLoading() 메서드는 호출되지 않는다.


서버에서 내려주는 게시물 관련 json의 게시물 객체를 데이터에서 링크로 변경해야하나?......

그러면 수정해야하는 부분이 많아진다. 안드로이드뿐만아니라 iOS도 함께 수정해야한다.

loadData를 loadUrl처럼 사용할 수 있는 방법이 없나? 구글링해도 못찾겠다.

loadData에 넘겨주는 파라미터를 갖고 일시적인 링크로 만들어줄 수 없는건가?

선임들이 없는 상황이라면 어떻게 해결해야할까?