[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 v30 | WebView v33 | WebView v36 | |
---|---|---|---|
WebGL | x | x | ✓ |
WebRTC | x | x | ✓ |
WebAudio | x | x | ✓ |
Fullscreen API | x | x | x |
Form validation | x | ✓ | ✓ |
Filesystem API | x | x | x |
File input type | x | x | x |
<datalist> | x | ✓ | ✓ |
WebRTC의 자세한것은 => http://www.html5rocks.com/ko/tutorials/webrtc/basics/
Supporting hardware sensor APIs on new WebView
WebView v30 | WebView v33 | |
---|---|---|
Geolocation API (requires android.permission.ACCESS_COARSE_LOCATION and/orandroid.permission.ACCESS_FINE_LOCATION permissions) | ✓ | ✓ |
Device Orientation API | x | x |
Media Capture and Streams | x | x |
Vibration API (requires android.permission.VIBRATE permission) | x | ✓ |
=> 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
댓글 없음:
댓글 쓰기