안드로이드 웹뷰 CookieSyncManager 정확한 사용법 > 자료실

자료실

자료실

안드로이드 웹뷰 CookieSyncManager 정확한 사용법

페이지 정보

profile_image
작성자 최고관리자
댓글 0 조회 991회 작성일 23-03-05 17:22
작성일 23-03-05 17:22

본문

안드로이드의 웹뷰를 사용함에 있어 쿠키 동기화가 잘 안 된다던가 인증이 지꾸 풀린다던가 하는 경험이 한번쯤은 있을 것이다.

인터넷을 찾아보면 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 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 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가 필요하다는 것.

추천 0 비추천 0

  • 회사 :
  • 대표 :
  • 주소 :
  • 메일 : admin@mysample.com
  • 사업자 등록번호 :
Copyright © cginjs.com All rights reserved.
notice