2014년 10월 20일 월요일

Android WebView

Android WebView 관련 궁금한 것들 찾아봄.


[General]

API Reference
: http://developer.android.com/reference/android/webkit/WebView.html

Tutorial with Android Studio
https://developer.chrome.com/multidevice/webview/gettingstarted

Building Web Apps in WebView
http://developer.android.com/guide/webapps/webview.html

Pixel-Perfect UI in the WebView
https://developer.chrome.com/multidevice/webview/pixelperfect

WebView를 이용한 App 개발 tutorial
 by 제트스윙(http://www.zetswing.com)

http://www.zetswing.com/bbs/board.php?bo_table=java_04&wr_id=2
  http://www.zetswing.com/bbs/board.php?bo_table=java_04&wr_id=3
    > Android 버전별 file chooser 동작 이슈 해결 방법 설명
  http://www.zetswing.com/bbs/board.php?bo_table=java_04&wr_id=5


[Chrome based WebView (Android 4.4.3 later)]

아래 링크에서 언급된 것 처럼 Android 4.4.3(KitKat)에서 부터 Chrome 기반 WebView가 사용되고 있다고 함.
 . Android 4.4.3에서는 Chrome 30.0.0.0 기반 WebView가 사용되고 있음.
 . Android L Developer Preview에서는 36.0.0.0 기반이 사용되고 있다고 함.
   : https://developer.chrome.com/multidevice/webview/overview
   : Android 5.0 LOLLIPOP에서는 37.0.0.0 기반이며 System WebView를 제공하여 Google Play Store를 통해 업데이트 되어 파편화 문제가 사라짐.
    > http://youtu.be/HHXwsgw7M8s?t=3m13s


WebView User Agent 
https://developer.chrome.com/multidevice/user-agent#webview_user_agent
Old WebView UA:Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP)AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30
New WebView UA:Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_)AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0Mobile Safari/537.36

Supporting Chrome(for Android)'s feature 
WebView v30WebView v33WebView v36
WebGLxx
WebRTCxx
WebAudioxx
Fullscreen APIxxx
Form validationx
Filesystem APIxxx
File input typexxx
<datalist>x
잘모르겠고 Android 5.0 LOLLIPOP의 WebView에서는 WebRTC가 된다는 말인가?
WebRTC의 자세한것은 => http://www.html5rocks.com/ko/tutorials/webrtc/basics/


Supporting hardware sensor APIs on new WebView
WebView v30WebView v33
Geolocation API
(requires
android.permission.ACCESS_COARSE_LOCATIONand/or
android.permission.ACCESS_FINE_LOCATIONpermissions)
Device Orientation APIxx
Media Capture and Streamsxx
Vibration API
(requires android.permission.VIBRATEpermission)
x
LOLLIPOP에서는 Vibration API가 지원된다는 얘기 이고 vibrations API는 아래 참고
=> https://developer.mozilla.org/ko/docs/Web/Guide/API/Vibration/Vibration


[Interface between JavaScript and Native]

아래 링크 참조
http://developer.android.com/guide/webapps/webview.html#UsingJavaScript

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
1. WebView를 생성
2. WebView의 WebSettings의 setJavaScriptEnalbed(true) 설정

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}
WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");
3. JavaScript interface class 구현 및 설정

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />
<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>
4. Javascript에서 Native 호출


addJavascriptInterface를 좀 더 들여야 보면
http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)

- Interface class의 method들 중
 . JELLY_BEAN_MR1 이상 : public method들과 @JavascriptInterface 명시된 것들만 호출
 . JELLY_BEAN 이하 : 모든 public method들이 호출 된다.
 => WebView를 사용한 app이 의도치 않은 JELLY_BEAN 이하 버전에서 동작할 때 webview interface의 모든 methods들이 호출 될 수 있으므로 보안상 신중하게 interface를 구현할 필요가 있음.

- JavaScript는 WebView의 private, background thread와 연동되므로 thread safety를 염두 해야 한다고 한다.. 실제예는 안 찾았음.
- Android 5.0 LOLLIPOP API level의 application의 WebView에서는 injected된 Java object의 methods들이 JavaScript에서 확인 가능하다고 한다.. 안해봄..
- Interface class의 method들은 primitve를 사용하는게 기본이겠지만 어떤 사람들은 JSONObject, JSONArray도 사용 가능하다고 한다..  안되면 그냥 stringify해서 넘기면 될듯
 => http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android
 Java object를 넘겼다는 사람도 있는데 봐도 이해가 안되고 왠지 그대로 하다가 고생할것 같다.. => http://stackoverflow.com/questions/21173888/how-to-pass-non-primitive-object-from-java-to-js-by-android-addjavascriptinterfa


[Android 버전별 WebView 이슈들]

Migrating to WebView in Android 4.4
: https://developer.android.com/guide/webapps/migrating.html

kitkat(4.4)에서 맞닥뜨린 이슈 및 해결
by marojun
https://medium.com/marojuns-android/kitkat-4-4-%EC%97%90%EC%84%9C-%EB%A7%9E%EB%8B%A5%EB%9C%A8%EB%A6%B0-%EC%9D%B4%EC%8A%88-%EB%B0%8F-%ED%95%B4%EA%B2%B0-1ecb94c24694

버전별 WebKit 버전
by Padgom
: http://padgom.tistory.com/entry/Android-%EB%B2%84%EC%A0%84%EB%B3%84-Webkit-%EB%B2%84%EC%A0%84

@JavascriptInterface
Caution: If you've set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotationto any method that you want available to your JavaScript (the method must also be public). If you do not provide the annotation, the method is not accessible by your web page when running on Android 4.2 or higher.



[Remote Debugging on Android with Chrome]
: https://developer.chrome.com/devtools/docs/remote-debugging


[기타]

찾다 보니 Mozilla GeckoView도 있구나..

HTML5의 충실한 지원으로, Android WebView를 대체하는 View로 충분한 Mozilla GeckoView 사용하기.. by 코딩한줄에 12시간
: http://sjava.net/?p=471


WebView attack 관련 논문
선 링크 후 분석...
http://www.cis.syr.edu/~wedu/Research/paper/webview_acsac2011.pdf





댓글 없음:

댓글 쓰기