ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 폰갭 업데이트하면서 변경된 부분
    개발 2015. 5. 1. 14:26

    몇 달전 구글스토어에 올린 앱에 사용된 폰갭 라이브러리가 보안상 취약점이 발견되었으니 업데이트하라는 메일을 받았다.

    당장 급한 것은 아니어서 업데이트를 미루고 있었는데, 앱의 일부분을 수정해야할 일이 생겨 급하게 폰갭을 업데이트하게 되었다.

    폰갭을 사용한지가 꽤 되었고, 또 보안 이슈가 발생후 시간이 지난 이후여서 관련된 라이브러리를 업데이트하는데 시간이 꽤 소요되었다.

    업데이트까지는 문제가 되지 않았는데, 그 이후 호환성 부분에 많은 문제가 발생하였다.


    폰갭은 카메라와 같은 네이티브 기능을 제공하기 위해 안드로이드에서 제공하는 WebView를 이용하지 않고 appView를 이용한다.

    appView를 이용하면 네이티브 함수를 호출할 수 있다.


    또 웹에서 앱을 제어하기 위해 몇가지 함수를 호출했었는데(앱 종료 버튼같은) 이 부분은 이렇게 처리 했었다.


    CordovaWebViewClient webViewClient = new MyWebViewClient(this);
    webViewClient.setWebView(this.appView);
    this.appView.setWebViewClient(webViewClient);
    this.appView.addJavascriptInterface(this, "MainActivity");


    하지만 폰갭을 업데이트하고 API도 업데이트가 된 이후에서는 appView 에 addJavascriptInterface() 부분이 빠져버렸다.

    그래서 appView에서는 자바함수를 호출하지 못했기에 안드로이드에서 제공하는 WebView를 이용하여 네이티브 통신을 하게 하였다.


    완전한 코드는 아니지만 아래와 같이 하면 그나마 네이티브함수 호출이 가능하다.


    setContentView(R.layout.activity_main);
           
    myWebView = (WebView)findViewById(R.id.web);
    myWebView.getSettings().setJavaScriptEnabled(true);
    myWebView.getSettings().setDomStorageEnabled(true); //localStorage를 사용할 수 있게 한다.
    myWebView.setWebChromeClient(new WebChromeClient());
    myWebView.setWebViewClient(new MyWebViewClient());
    myWebView.addJavascriptInterface(this, "MainActivity");

    myWebView.loadUrl(loadUrl);


    appView를 이용하다 WebView를 이용하면서 일부 달라진 기능이 생겼다. IE만 쓰다가 FireFox로 갈아타면서 호환성 문제같은 느낌?


    우선 로그인 페이지에 아이디를 기억하기 위해 localStorage 기능을 사용했었는데, 이 기능이 동작하지 않았다.

    이 기능은 setDomStorageEnabled(true); 처리해줘야 사용이 가능하다.


    거꾸로 자바에서 웹뷰의 스크립트를 호출해야하는 경우도 있는데 그러면 setWebChromeClient(new WebChromeClient()); 호출해야 한다.


    그리고 자바함수 호출시 어노테이션(@JavascriptInterface)이 필요하다. 이는 4.2.0부터 적용된 것 같다.


    예를 들어


    기존 :

    public void appExit() {
            handler.post(new Runnable() {
                public void run() {
                    MainActivity.this.finish();
                    System.exit(0);       
                }
            });
        }


    이후 :

    @JavascriptInterface

    public void appExit() {
            handler.post(new Runnable() {
                public void run() {
                    MainActivity.this.finish();
                    System.exit(0);       
                }
            });
        }


    위와 같이하면 일단은 웹과 네이티브 함수 호출이 가능하다.

    하지만 폰갭의 appView를 이용하는 것이 아닌 webView를 이용하기 때문에 카메라 같은 디바이스 장치 호출은 할 수 없다.

    플러그인 부분이 개선된 것 같은데, 이 부분은 좀 더 살펴봐야할 것 같다.


    반응형

    '개발' 카테고리의 다른 글

    AIX 에서 시간 설정하기  (0) 2015.12.10
    input 필드에 숫자만 입력받기  (0) 2015.10.26
    제우스의 기본적인 명령어들  (0) 2015.04.21
    웹투비 없이 제우스 띄우는 방법  (0) 2015.04.21
    티베로 DB 백업 및 복원  (0) 2015.04.21

    댓글

Designed by Tistory.