반응형
안드로이드의 웹뷰를 사용함에 있어 쿠키 동기화가 잘 안 된다던가 인증이 지꾸 풀린다던가 하는 경험이 한번쯤은 있을 것이다.
인터넷을 찾아보면 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가 필요하다는 것.
반응형
'개발 > 안드로이드' 카테고리의 다른 글
FragmentStatePagerAdapter와의 모험 (0) | 2018.07.27 |
---|---|
안드로이드 apk 디컴파일 및 리패키징 (0) | 2017.09.14 |
웹 브라우저 링크로 앱 실행 방법 (0) | 2017.08.24 |
알림 큰 이미지 사이즈(notification Bigpicturestyle) (0) | 2017.07.27 |
해상도별 아이콘 사이즈 (0) | 2017.06.28 |
댓글