저도 아직 자세히는 파악을 하지 못했지만 WebView.java를 보니깐 WebView로 url를 로드 하면 로드 할때마다 쿠키를 사용하지 못하더군요. 아 사용 못하는게 아니고 대략 테스트를 해보니 로드된 페이지에서 쿠키를 저장하고 있는데 약 5분 정도가 지나야 WebView에서도 적용이 되더군요. 이상해서 WebView를 까보니 WebView로 로드 하게되면 로드 될때마다 쿠키를 초기화 하더군요.
이를 해결하기 위해서는 CookieSyncManager를 사용해야 합니다.
액티비티를 호출하게 되면 그 생명주기에 맞게 Override한 메소드를 타게 되어있는데 그에 맞게 CookieSyncManager를 사용하면 WebView로 띄운 Url의 쿠키를 어플에 바로 적용이 되더군요
@Override
public void onStart() {
super.onStart();
CookieSyncManager.createInstance(this);
}
액티비티가 호출되면 onStart 메소드를 타는데 이때 인스턴스를 생성하고
@Override
public void onResume(){
super.onResume();
CookieSyncManager.getInstance().startSync();
}
액티비티가 상호작용이 이루지면 onResume 메소드를 거칩니다. 이때 생성한 인스턴스를
startSync() 해줍니다.
그리고 액티비티가 종료될 수 도 있는 상태인 일시정지 상태(종료되는건 아님)에 stopSync() 해줍니다.
@Override
public void onPause(){
super.onPause();
CookieSyncManager.getInstance().stopSync();
}
이렇게 해놓으면 액티비티 생명주기에 따라 쿠키를 동기화 시켜주게 됩니다.
그리고 하나더 중요한 부분이
WebView를 띄울때 브라우저에서 제어권을 넘겨 받는 부분인 setWebViewClient의 페이지 로딩이 끝나면 타는 메소드인 onPageFinished 안에 쿠키를 분석해놔야 합니다.
webView.setWebViewClient(new MyWebClient{
public boolean shouldOverrideUrlLoading(WebView view, String url){
view.loadUrl(url);
return true;
}
//WebView가 로딩이 끝나면 시작
public void onPageFinished(WebView view, String url){
CookieSyncManager.getInstance().sync();
}
});
참고로 말씀들이면 이 방법이 틀렸을 수도 있습니다. 한동안 WebView로 해당 URL의 쿠키를 사용할 수 있게 하기 위해서 별짓을 다 해봤는데 이 방법으로 하니 잘 되더군요.
그리고 구지 이 방법으로 하지 않아도 됩니다. 웹서버에서 쿠키를 저장하게 하지 않고 해당 URL이 로딩하게 되면 비지니스 로직에 맞게 해당 페이지에서 App을 호출해서 값을 넘겨서 App에서 강제로 쿠키매니저로 저장하시면 됩니다. 하지만 별로 권하고 싶지 않군요
이유는 웹에서 이미 쿠키를 저장하고 있는데(하이브리드 App 이니깐용) 구지 그걸 어플에서 다시 getCookie 해서 set을 하던지 해서 조작할 필요없다고 생각합니다. 뭐 물론 특별한 상용에서는 논외로 해야하지만용~ 아무튼 그냥 단순히 모바일 웹에서 잘 되던 쿠키가 WebView로 로딩하니깐 안된다면 위 방법을 한번 사용해 보시기 바랍니다.(거듭강조하지만 이 방법이 정확한건 아닙니다.)
그럼 참고해주시고 혹시 제가 파악한 위 사항이 잘못되었다면 저에게도 좀 알려주시기 바랍니다 ㅜ.ㅜ 그럼 잡스형에게 삿대질 할 그날까지 ~~
안드로이드 기반의 WebView를 사용하다 보면 쿠키와 관련 부분의 동작이 조금 이상한 것을 발견하실 수 있습니다. 예를 들자면 로그인을 했는데 사용중에 갑자기 로그인이 풀려버린다거나 로그아웃을 아무리 해도 로그아웃처리가 되지 않는 문제가 있습니다.
이러한 문제는 실제로 어플리케이션이 할당 받은 메모리 영역(RAM)과 전체 쿠기가 보관되는 지역 저장소간의 동기화가 제대로 이루어지지 못하는데서 발생하는 문제입니다. 다음에서 보여드릴 CookieSyncManager를 이용하여 이 문제를 해결할 수 있습니다.
[code]@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CookieSyncManager.createInstance(this); }[/code] 위와같이 onCreate내에서 싱크를 시작하여 주도록 합시다. 이 명령은 어플리케이션의 가장 Host가 되는 액티비티의 생성시에 호출해 주시면 됩니다. 액티비티마다 매번 호출하실 필요가 없습니다.
[code]@Override protected void onResume() { super.onResume(); CookieSyncManager.getInstance().startSync(); }[/code] 위의 명령을 onResume() 메서드 안에서 구현해 주도록 합시다.
[code]@Override protected void onPause() { super.onPause(); CookieSyncManager.getInstance().stopSync(); }[/code] 위의 명령을 onPause() 메서드 안에서 구현해 주도록 합시다. 위와 같은 과정을 통해 어플리케이션이 실행되면 쿠키싱크 매니저의 인스턴스를 생성하고 어플리케이션이 중지 상태로 들어가게 되면 싱크를 중단시켜 외부의 어플리케이션에 의해 쿠키가 꼬이는것을 방지하여 줍니다. 이후에 어플리케이션이 다시 시작되면 쿠키 동기화를 재시작합니다.
실제로 제작했던 어플리케이션의 쿠키 문제가 “정말 아주 간헐적”으로 발생해서 원인을 찾기도 어려웠는데 위와같은 처리를 하고나니 아무런 문제없이 해결이 되었네요.