저도 아직 자세히는 파악을 하지 못했지만 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로 로딩하니깐 안된다면 위 방법을 한번 사용해 보시기 바랍니다.(거듭강조하지만 이 방법이 정확한건 아닙니다.)
그럼 참고해주시고 혹시 제가 파악한 위 사항이 잘못되었다면 저에게도 좀 알려주시기 바랍니다 ㅜ.ㅜ 그럼 잡스형에게 삿대질 할 그날까지 ~~
댓글 없음:
댓글 쓰기