인증되지 않은 애플리케이션을 실행해서 '안드로이드 마켓(최근 'play store'로 명칭 변경)'으로 이동하여 동일한 애플리케이션을 업데이트하려고 하면 위와 같은 팝업이 뜬다. 제거를 눌러서 폰에 설치되어 있는 애플리케이션을 제거하고, 설치하면 간단하게 처리가 된다.


위와 같은 상황이 뜬 것은, 안드로이드앱 업데이트 확인절차(안드로이드 마켓 말고 서비스를 제공하는 운영서버에 등록된 앱버전을 확인)를 걸쳐서 마켓으로 이동을 했을 때 나타나는 현상이다.

현재 구글마켓에서 등록된 앱버전을 확인할 수 있는 방법은 없어보인다.

Posted by 허니몬

프로젝트에서 하이브리드앱 형태로 해서 모바일웹페이지를 안드로이드의 웹뷰에서 보여주며 동작시키는 앱을 만들었다.

제조사마다 다양한 종류의 디바이스에서 테스트를 해봐야하는 안드로이드 개발은 앞으로도 고역이 될 것 같다.


얼마간 나를 괴롭히던 녀석이 있었다.

로그인을 할때 CookieManager를 이용해서 웹뷰의 쿠키 Sync를 맞춰두고 로그인상태를 유지하도록 만들었다.

이 싱크를 맞추는 작업이 지금까지도 곤혹스럽다. 


갤럭시S는 사용자가 많다. 그런데 가장 이상한 안드로이드폰이 갤럭시S다. 갤럭시S를 제외한 안드로이드폰들에서는

정상적으로 동작하는 앱이 꼭! 갤럭시S에서는 다르게 반응하는 것이다. 후아.

인터넷을 뒤져보다가 이 문제에 대한 해결책을 찾았다.


  
/**
 * Remove all session cookies, which are cookies without expiration date
 */
public void removeSessionCookie() {
    final Runnable clearCache = new Runnable() {
        public void run() {
            synchronized(CookieManager.this) {
                Collection> cookieList = mCookieMap.values();
                Iterator> listIter = cookieList.iterator();
                while (listIter.hasNext()) {
                    ArrayList list = listIter.next();
                    Iterator iter = list.iterator();
                    while (iter.hasNext()) {
                        Cookie cookie = iter.next();
                        if (cookie.expires == -1) {
                            iter.remove();
                        }
                    }
                }
                CookieSyncManager.getInstance().clearSessionCookies();
            }
        }
    };
    new Thread(clearCache).start();
}

위의 소스를 보면 마지막에 new Thread(clearCache).start()가 실행되는 것이 보인다. CookieManager.removeSessionCookie() 가 스레드로 실행되는 것을 확인할 수 있다.

갤럭시S가 다른폰들과 다른 반응을 보인 부분이 이 부분이다.


인터넷에 해결방법이 있을까?


하는 생각으로 인터넷을 뒤적거리다가 해결방법을 찾았다.

jinu's blog : Android webview cookie sync 문제 : http://jinu.info/blog/372

1년 전에 작성된 글인데, 글의 중간에 보면

try { Thread.sleep(500); } catch (Exception e) {}


위의 코드가 핵심이다. 500ms의 강제 대기시간을 주어서 cookieManager가 세션쿠키를 삭제할 수 있는 충분한 시간적인 여유를 부여한 후에 진행되도록 하는 것이다.


<< 위의 내용을 힌트삼아서 수정한 소스 >>

  
public void removeAllCookie() {
        Log.d(LOG_TAG, "webViewHelper removeAllCookie execute.");
        cookieManager.removeAllCookie();
        threadSleep();
        setDefaultCookies();
        CookieSyncManager.getInstance().sync();
    }

    public void removeSessionCookies() {
        Log.d(LOG_TAG, "webViewHelper removeSessionCookies execute.");
        cookieManager.removeSessionCookie();
        threadSleep();
        this.httpClient = null;
        setDefaultCookies();
        CookieSyncManager.getInstance().sync();
    }

    private void threadSleep() {
        try {
            Thread.sleep(500);
        } catch (Exception e) {
            Log.d(LOG_TAG, "thread Exception!");
        }
    }

처럼 처리했다.

저작자 표시
Posted by 허니몬

안드로이드 프로젝트를 SVN에 등록하고, 소스버전관리를 하다가 작업폴더를 정돈하면서 옮기기 위해 SVN에 있는 Check out으로 내려받았다. 그런데 이클립스 이녀석!!이 내려받은 안드로이드 프로젝트를 제대로 인식하지 않는 것이다. 몇가지 방법을 동원해봤지만 마음에 들지 않는다.

그래서 인터넷 검색을 했다. 그리고 발견했다.


링크 : SVN으로 받은 후 android 프로젝트로 인식시키는 방법



방법 :


1. SVN으로 원하는 안드로이드 프로젝트를 체크아웃(Check Out)하여 소스를 내려받는다.

2. new Project 를 이용해서 새로운 안드로이드 프로젝트를 생성한다.

3. 파일 탐색기등을 이용해서 새로 생성한 안드로이드 프로젝트 폴더 루트에 있는 .classpath, .project 파일 두개를 'SVN으로 내려받은 안드로이드 프로젝트 루트'에 복사한다.

4. F5를 눌러서 프로젝트를 다시 읽는다.

5. 대체적으로 정상적으로 인식 될 것이다.


딱히 이클립스에서 해결할 수 있는 방법은 없는 것으로 보인다. 다음에는 maven을 이용해서 프로젝트 소스와 라이브러리를 관리해볼까한다. 미루지말고 이녀석부터 당장해볼까? ㅡ_-)?

저작자 표시
Posted by 허니몬
이전버튼 1 이전버튼