* 출처
: http://blog.naver.com/puresprout77/220842005470
안드로이드의 웹뷰를 사용함에 있어 쿠키 동기화가 잘 안 된다던가 인증이 지꾸 풀린다던가 하는 경험이 한번쯤은 있을 것이다.
인터넷을 찾아보면 CookieSyncManager로 동기화를 하면 된다고는 하지만, 건헐적으로 동작하지 않을 때가 있다.
어떻게 하면 정확하게 할수 있는지 알아보도록 하자.
먼저, 안드로이드에서 CookieManager는 두 개의 다른 클래스가 있다.
- java.net.CookieManager
- android.webkit.CookieManager
여기서 1번은 논외다. 웹뷰하고는 전혀 상관이 없고, UrlConnection을 통해 HTTP API 통신을 할 때, 쿠키를 관리하는 용도다.
2번이 웹뷰가 사용하는 쿠키를 관리하는 용도이다.
CookieSyncManager는 브라우저 쿠키를 RAM과 영구 저장소 사이에서 동기화한다. 최상의 성능을 내기 위해, 브라우저 쿠키는 RAM에 저장되고, 별도의 쓰레드가 타이머에 의해 이 둘간에 동기화를 한다.
다음은 정확한 사용법이다. 인터넷에 보면 사용법은 많이 나와있지만, 모든 상황을 전부 고려하지는 못했다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = (WebView) findViewById(R.id.webView);
webView.setWebViewClient(webViewClient);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
//noinspection deprecation
CookieSyncManager.createInstance(this);
}
}
@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
//noinspection deprecation
CookieSyncManager.getInstance().startSync();
}
}
@Override
protected void onPause() {
super.onPause();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
//noinspection deprecation
CookieSyncManager.getInstance().stopSync();
}
}
WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
/* NOTICE 로그인을 한 다음 앱을 종료하고, 다시 앱을 실행했을 때 간헐적으로 로그인이 안 된 상태가 된다.
이는 웹뷰의 RAM과 영구 저장소 사이에 쿠키가 동기화가 안 되어 있기 때문이다. 따라서 강제로 동기화를 해준다. */
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
//noinspection deprecation
CookieSyncManager.getInstance().sync();
} else {
// 롤리팝 이상에서는 CookieManager의 flush를 하도록 변경됨.
CookieManager.getInstance().flush();
}
}
핵심은 WebViewClient의 onPageFinished() 메소드에서 강제 sync가 필요하다는 것.
'IT_Programming > Android_Java' 카테고리의 다른 글
안드로이드 데이터 바인딩 (0) | 2016.11.11 |
---|---|
[펌] Android Support Annotations 라이브러리를 활용한 결함 탐지 (0) | 2016.11.02 |
[펌][안드로이드] ConstraintLayout 사용하기 / 안드로이드 컨스트레인트레이아웃. (Android ConstraintLayout) (0) | 2016.09.29 |
[펌] Android Support Library 24.2.0의 버그 (0) | 2016.09.28 |
Android 7.0(Nougat)에서 DatePickerDialog 예외사항 (0) | 2016.09.01 |