안드로이드 WEBView 와 APP 간에 인터페이스 호출

WebView 와 APP 간에 데이터 전송

WebAPP 을 만드는 중인데 WebView 에 데이터를 보내야 할때

APP 에서 WebView 의 자바스크립트를 호출해야 할 때
WebView 에서 APP 의 함수를 호출해야 할 때를 확인해보자

App 에서 WebView 함수 호출

WebView 가 로딩되고 함수가 호출 되어야 한다
WebView Client 의 onPageFinished 를 활용해야 한다

왜냐하면 Web 페이지가 로딩이 다 되어야 함수를 호출 할 수 있는데
loadUrl 이 비동기라서 Web 페이지 로딩 여부와 상관없이 실행된다

1
2
3
4
5
6
7
8
9
10
11
val inAppHtmlUrl = "https://skyksit.com/assets/index.html"
myWebView.loadUrl(inAppHtmlUrl)

private class LocalContentWebViewClient(private val assetLoader: WebViewAssetLoader, private val gameUrl: String?) : WebViewClientCompat() {
...
override fun onPageFinishied(view: WebView?, url: String?) {
super.onPageFinished(view, url)
view?.loadUrl("javascript:runDosGame('$gameUrl')")
}
...
}

WebView 에서 APP 함수 호출

  1. WebView 에서 호출할 함수를 @JavascriptInterface 만들고
  2. webview.addJavascriptInterface 로 함수를 설정해주고
  3. webview 에서 1번에서 만든 함수를 호출한다
1
2
3
4
5
6
7
8
9
10
11
12
override fun onCreate(savedInstanceState: Bundle?) {
...
myWebView.addJavascriptInterface(WebAppInterface(), "DosGameApp")
...

inner class WebAppInterface(private val mContext: Context) {
/** Show a toast from the web page */
@JavascriptInterface
fun showToast(toast: String) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()
}
}
1
2
3
<script>
DosGameApp.showToast("Call App Function")
</script>