달력

3

« 2019/3 »

  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  
  •  

'폰갭'에 해당되는 글 1

  1. 2015.05.01 폰갭 업데이트하면서 변경된 부분
2015.05.01 14:26

폰갭 업데이트하면서 변경된 부분 개발2015.05.01 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를 이용하기 때문에 카메라 같은 디바이스 장치 호출은 할 수 없다.

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


TAG
Posted by 에드몽단테스