안드로이드에서 native 와 webview 간 cookie 공유 안되는 문제

안녕하세요.
현재 titanium 으로 열심히 개발을 하고 있고, 곧 완성을 앞두고 있습니다.

다름이 아니라 createHTTPClient() 를 이용해서 로그인을 하고 있습니다.
아이폰에서는 이 createHTTPClient 로 로그인을 하면 webview 에서도 로그인이 되어 있는걸로 나옵니다.
하지만 안드로이드에서는 로그인 되어 있지 않은 상태로 나오네요.

찾아보니 안드로이드는 native 와 webview 간의 cookie 공유가 안된다고 합니다.

지금까지는 createHTTPClient 에서 로그인이 되었을 때 cookie 값을 아래와 같이 propertie 에 저장하고 있습니다.

Ti.App.Properties.setString('cookie', ''+loginReq.getResponseHeader('Set-Cookie')+''); 

그런 후 webview 를 띄울 때 아래처럼 cookie 값을 전달하려 하는데 안되네요 -_-;
$.helpdesk 는 webview 입니다.

$.helpdesk.addEventListener('beforeload', function () { 
    $.helpdesk.evalJS('document.cookie="'+Ti.App.Properties.getString('cookie')+'"'); 
});

혹시 안드로이드에서는 native 와 webview 사이에 로그인 세션 공유를 어떻게 해야 할까요?

저 같은 경우에는 md5암호화 해서 파라미터로 던져주는데요.
공유가 되면 편리하겠네요.

저도 하다 하다 모르겠어서 그냥 파라미터로 던져주는걸로 수정 했습니다.
답변 고맙습니다~

@paolo2000 님이 첨부한 링크에서 사용한 CookieSyncManager를 이용하면 동기화가 가능하겠군요.
http://developer.android.com/reference/android/webkit/CookieSyncManager.html

정확한 사용법을 파악한 후 모듈로 만들어 두면 편할 것 같은데 제가 한번 만들어 볼까요? ㅎ

아니면 다른 분이 한번 들어주세요.^^ 참고가 될 만한 gist가 있네요.

안드로이드 모듈을 한번 만들어보았는데
ti의 httpClient로 받은 Set-cookie를 webview에 쓰는 것 까지는 가능했습니다.
그런데 구글 문서에 나와있듯이 동기화는 안되네요.
다음주에 조금 더 해보고 현재 버전이라도 공유할께요.

이런 만들면서 잘 안되길래 검색해봤더니…
3.2 버전에는 cookiemanager가 api로 노출 된답니다.^^
삽질했네요. 덕분에 android 모듈 만들기 살펴봤네요.ㅎㅎ

https://jira.appcelerator.org/browse/TIMOB-15244

고생 많으셨습니다. 좋은 정보 항상 도움 받고 있습니다.

1개의 좋아요

httpclient에서 로그인기능을 구현하고 webview에서 세션을 공유하고 싶을 경우,
(혹시나 도움이 될까해서 적습니다)

var domain  = "example.com";
var path       = "/";

var client = Ti.Network.createHTTPClient({
    onload : function(e) {

        // webview가 사용하는 systemCookie를 삭제합니다. 덮어 쓰고 싶지만 동일 명의 쿠키가 두개 생겨서 문제가 생기네요.
        Ti.Network.removeSystemCookies(domain, path, null);

        //  http클라이언트의 쿠키를 취득해서 webview가 이용하는 systemCookie에 추가합니다. JSESSIONID는 덮어쓰고 싶는 쿠키이름.
        var httpClientCookie = Ti.Network.getHTTPCookies(domain, path, "JSESSIONID");                         
        Ti.Network.addSystemCookie(httpClientCookie[0]);

    },
    onerror : function(e) {
       // error
    }
});
2개의 좋아요