@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CookieSyncManager.createInstance(this);
}
위와같이 onCreate내에서 싱크를 시작하여 주도록 합시다. 이 명령은 어플리케이션의 가장 Host가 되는 액티비티의
생성시에 호출해 주시면 됩니다. 액티비티마다 매번 호출하실 필요가 없습니다.
@Override
protected void onResume()
{
super.onResume();
CookieSyncManager.getInstance().startSync();
}
위의 명령을 onResume() 메서드 안에서 구현해 주도록 합시다.
@Override
protected void onPause()
{
super.onPause();
CookieSyncManager.getInstance().stopSync();
}
위의 명령을 onPause() 메서드 안에서 구현해 주도록 합시다.
위와 같은 과정을 통해 어플리케이션이 실행되면 쿠키싱크 매니저의 인스턴스를 생성하고 어플리케이션이 중지 상태로 들어가게
되면 싱크를 중단시켜 외부의 어플리케이션에 의해 쿠키가 꼬이는것을 방지하여 줍니다. 이후에 어플리케이션이 다시 시작되면 쿠키 동기화를 재시작합니다.
실제로 제작했던 어플리케이션의 쿠키 문제가 “정말 아주 간헐적”으로 발생해서 원인을 찾기도 어려웠는데 위와같은 처리를 하고나니 아무런 문제없이 해결이 되었네요.
아래 예제는 실제 프로젝트에서 사용해 봤던 예제 입니다.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
WebView wv = (WebView) findViewById(R.id.webview_test);
///////////////// 쿠키 읽어와 동기화 시키는 부분 추가 /////////////
Cookie sessionCookie =null;
try {
if(!SessionControl.cookies.isEmpty())
{
sessionCookie=SessionControl.cookies.get(0);
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
if (sessionCookie != null)
{
cookieManager.removeSessionCookie();
String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();
cookieManager.setCookie(myUrlAddress, cookieString);
CookieSyncManager.getInstance().sync();
}
}
}catch(Exception e){
e.printStackTrace();
}finally
{
}
/////////////////
wv.loadUrl(myUrlAddress);
}
public void onResume() {
super.onResume();
CookieSyncManager.getInstance().startSync();
}
public void onPause() {
super.onPause();
if (CookieSyncManager.getInstance() != null) {
CookieSyncManager.getInstance().stopSync();
}
}