001. 네이티브 플랫폼 별 쿠키 삭제 구현 방법

Programming/Old 2016. 5. 5. 16:56

1. 문제 발단

SNS 로그인 기능은 무난하게 구현하였지만, 쿠키 정보가 초기화 되지 않아 정상적으로 로그아웃이 되지 않는 문제가 발생하였습니다.


2. 문제 원인

cocos2d-x의 webview에서 쿠키와 관련된 기능이 전혀 구현되지 않았기 때문입니다. 만들거면 좀 제대로 만들어주지...


3. 문제 해결

cocos2d-x 래퍼 클래스가 래퍼하고 있는 Android와 iOS 코드를 직접 수정하여 해결했습니다.

네이티브로 앱을 작성했다면 크게 문제되지 않는, 아주 쉬운 구현입니다. 


Android 쿠키 삭제 코드

CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(webView.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.removeAllCookie();
cookieSyncManager.sync();

코드 발췌 : http://uzea123.tistory.com/1


iOS 쿠키 삭제 코드

NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies]){
[storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];

코드 발췌 : http://beageek.biz/how-to-clean-web-cookies-uiwebview/

위의 코드를 삽입하면 정상적으로 쿠키가 삭제되어 로그아웃 후에도 정상적으로 로그인을 진행할 수 있습니다.

문제는 이 코드를 어디에 어떻게 삽입하느냐입니다. 우선 안드로이드부터 보겠습니다.


1) 안드로이드에서 쿠키 삭제 코드 적용

안드로이드 스튜디오로 proj.android 프로젝트를 엽니다. 그리고 왼쪽의 프로젝트 탐색기에서 org.cocos2dx 패키지의 lib 폴더를 엽니다.

그러면 Cocos2dxWebView.java라는 파일을 찾을 수 있습니다. 이 파일을 열어 removeWebview라는 함수를 찾습니다.

이 함수는 cocos2d-x에서 webview가 제거될 때 소멸자에 의해 호출되어 webview를 제거하는 역할을 합니다만, 코드를 보면 알겠지만 ui만 삭제하고 있지 쿠키나 세션과 관련된 아무런 정보도 다루고 있지 않습니다. 그래서 안드로이드에서 쿠키정보가 온전히 남아 있었던 것입니다.

이 함수에 구현된 조건문 안에 위의 Android 쿠키 삭제 코드를 삽입합니다. 그리고 visual studio에서 cocos2d-x 프로젝트를 클린한 후 빌드를 하면 쿠키 삭제 기능이 적용이 됩니다. 


2) iOS에서 쿠키 삭제 코드 적용

iOS에서의 적용 방법도 크게 어렵지는 않습니다. 

iOS용으로 webview를 구현하는 클래스를 찾기 위해 cocos2d-x가 설치된 폴더를 찾아갑니다. 저같은 경우 디렉토리 주소가 cocos->cocos2d-x 3.10였습니다.

이곳에서 cocos 디렉토리-> ui 디렉토리를 따라 이동하면 UIWebViewImpl-ios.mm 이라는 파일을 확인할 수 있습니다. 

이 파일을 연 후, (void)dealloc 이라는 함수를 찾습니다. 안드로이드와 마찬가지로 이 함수 역시 webview가 삭제될 때 호출됩니다. 

역시 쿠키나 세션과 관련된 그 어떤 코드도 찾아볼 수 없기 때문에 이 함수 내부에 iOS 삭제 코드를 입력해야 합니다.


입력을 다 하셨다면 터미널 창을 열어 cocos gen-libs -p ios 라는 문구를 입력합니다. 이 과정은 iOS의 prebuilt용 라이브러리를 생성하기 위함입니다.

저는 prebuilt 방식으로 프로젝트를 생성하였기 때문에 iOS 프로젝트가 libcocos2d iOS.a라는 라이브러리를 참조하고 있습니다. 이 라이브러리에는 cocos2d-x의 래퍼 클래스들이 집합되어 있지만, 라이브러리의 클래스들을 직접 수정할 수 없기 때문에 터미널을 통해 라이브러리를 다시 생성해줘야 합니다. 이 과정에서 빌드 시간이 굉장히 오래 걸리니 차라도 한잔 하고 오세요.


빌드가 끝나 정상적으로 라이브러리 파일이 생성되었다면, Xcode에서 개발 중인 cocos2d-x 프로젝트를 클린 한 후 빌드를 하면 정상적으로 적용된 것을 확인할 수 있습니다.


4. 결론

cocos2d-x는 기본적으로 게임에 특화된 플랫폼이기 때문에 webview와 관련된 기능을 제대로 지원해주지 않는다 해서 크게 불평을 할 수는 없다고 생각합니다.

그리고 여러 크로스플랫폼을 다뤄본 결과, ui와 관련된 부분은 상당히 잘 지원해주지만 그 외 성능이나 다른 여타 세심한 부분은 미숙한 부분이 굉장히 많습니다.

특히나 네이티브와 비슷한 자유도(특히 안드로이드)로 webview를 구현한 플랫폼은 아직까지 거의 찾아보지 못 했습니다. 사실 Xamarin을 하다 cocos2d-x로 넘어온 이유도 webview의 한계 때문이었습니다. 물론 그 때도 이런 식으로 문제를 해결했으면 괜찮았겠지만, 이 부분 말고도 뷰가 붙는 속도 너무 느렸다는 점도 한 몫 했었습니다. 

어쨌든 앞으로도 발생하는 문제에 대해서도 이번처럼 접근해 보면 심심치 않게 문제를 해결할 수 있을 것이라 기대됩니다.



admin