[Android] Samsung Android Kitkat 핸드폰에서 Webview 의 내용이 갱신되지 않는 문제(Cache)



문제

단말기 - Samsung Android KitKat Webview
문제 - 보여지는 Content 가 서버에서는 변경되었지만 Webview 에서는 Cache 기능으로인해 갱신되지 않고 그대로 보여진다.

PS.
  - LG 단말기와 같은 다른 단말기에서는 App 종료 후 다시 기동 시 문제가 없었음.








증상 및 분석

1. tPacketCapture(Link) 프로그램을 이용해 Webview 를 호출 할 때 패킷을 캡쳐함.

2. Response 받을 때 HTTP status 가 200(OK) 이나 304(Not Modified) 가 아니라 301(Moved Permanently) 이나 302(Found) 로 내려온다.

3. App을 재구동 시 서버에 요청을 하면 302 코드로 응답을 받을 후 원래의 URL 뒤에 슬래시(/)를 붙여서 다시 요청을 했다.
  ex) 1. http://test.com/test  (Response 302)
        2. http://test.com/test/ (Response 200)


PS.
1. Http 의 Response 에서 HTTP status 301, 302 값은 Redirect 기능을 하는 스펙으로 정의가 되어있는데 App 이 종료되지 않는 상황에서는 Webview 내부적인 Cache 때문에 해당 Contents 를 새로 받아올 수 없었고 App을 재구동 한 시점에는 다시 Contents 를 받아올 수 있었다. (Samsung Android Kitkat 제외)

2. Samsung Android Kitkat 에서는 컨텐츠를 처음 받을때에만 원래 URL 뒤에 슬래시(/)를 붙여서 요청을 했다.(이후에는 App 재구동 시에도 Response 302를 받고 진행 없음)






원인

Android 에서 필요한 Contents 의 URL은 다음과 같다.
http://test.com/test/index.html

하지만 웹서버에서 Redirect 를 시켜 마지막에 슬래시(/)를 붙여주었고 index 우선순위에 따라 자동으로 필요한 Contents 를 내려주었다.

만약에 마지막에 슬래시(/)를 붙여서 웹서버에 요청을 했다면 Response HTTP status 가 200 또는 304 가 되었을텐데 매번 302로 내려받다보니 특정 단말기에서 변경된 Contents 를 받아오지 못하는 현상이 생겼다. (Samsung Android Kitkat 의 버그로 봐야 할까..)






해결방안

이미 Android App 은 사람들에게 설치가 되어있는 상황이니 Android 에서 변경하지 않고 웹서버에서 변경을 시켰다.

사용하고 있는 웹서버가 Nginx 인데 rewrite 기능을 이용하여 내부 리다이렉트(Internal Redirect) 기능을 이용하여 http://test.com/test URL로 요청 시 바로 응답을 줄 수 있도록 설정을 변경했다.


서버 설정방법
http://1004lucifer.blogspot.kr/2015/02/nginx-internal-redirection-301302-200.html



댓글