안드로이드
[Android/WebView] 안드로이드에서 WebView의 함수 호출하기
익세망
2022. 1. 6. 15:31
WebView 설정
먼저 assets/web 폴더 안에 있는 index.html을 불러온다.
val url = "file:///android_asset/web/index.html"
binding.webView.loadUrl(url)
그 다음 웹페이지의 JavaScript 기능을 사용하기 위해 다음과 같은 설정 코드를 넣어준다.
binding.webView.settings.javaScriptEnabled = true
JavaScript 호출하기
기본적으로 JavaScript를 호출할 때에는 WebView.loadUrl(String) 함수를 이용하고
다음과 같은 형태로 사용한다.
// 함수 호출
binding.webView.loadUrl("javascript:sum(1,2)")
binding.webView.loadUrl("javascript:number.sum(1,2)") // 참조변수 접근
binding.webView.loadUrl("javascript:(new Number()).sum(1,2)") // 익명객체 접근
// 변수 선언
binding.webView.loadUrl("javascript:const number = new Number()")
함수의 반환 값 얻기
해당 함수를 몰랐을 때에는 웹에서 작업 한 후 앱의 함수를 호출하게 구현 했었는데
WebView.evaluateJavaScript(String, ValueCallback<String>) 이라는 반환하는 함수가 있었다.
해당 함수를 사용하면서 반환값을 알 필요가 없는 경우에는 ValueCallback에 null을 넣을 수 있고
어떤 값이든 반환은 String으로 넘어온다.
// 반환 값이 필요 없는 경우
evaluateJavascript("javascript:sum(1,2)", null)
// 반환 값이 필요한 경우
evaluateJavascript("javascript:sum(1,2)") { value ->
// handle value
}
확장 함수 사용하기
실행할 script를 String째로 넘기다보니 함수의 스펙만 보고 작성하는게 아니라
문자열로 만들어서 타이핑하는게 불편하다고 생각해서
스펙만 보고 선언적으로 작성할 수 있게 확장 함수로 만들었다.
// calculator.sum(a, b)
binding.webView.executeScript(
references = listOf("calculator"),
functionName = "sum",
params = listOf(a, b)
) { value ->
Log.d("TAG", value)
}
// sum(a, b)
binding.webView.executeScript(
functionName = "sum",
params = listOf(a, b)
) { value ->
Log.d("TAG", value)
}
// reset(), no return
binding.webView.executeScript(
functionName = "reset"
)
// const calculator = new Calculator()
binding.webView.executeScript(
variableName = "calculator",
constructorName = "Calculator"
)
// 변수 선언
fun WebView.executeScript(
variableName: String,
constructorName: String,
params: List<Any> = emptyList(),
onResult: (value: String) -> Unit = {}
) {
val sb = StringBuilder()
sb.append("javascript:")
.append("const ")
.append(variableName)
.append(" = ")
.append("new ")
.append(constructorName)
.append("(")
.append(params.joinToString(", "))
.append(")")
evaluateJavascript(sb.toString(), onResult)
}
// 함수 호출
fun WebView.executeScript(
references: List<String> = emptyList(),
functionName: String,
params: List<Any> = emptyList(),
onResult: (value: String) -> Unit = {}
) {
val sb = StringBuilder()
sb.append("javascript:")
.append(references.joinToString("."))
.append(".")
.append(functionName)
.append("(")
.append(params.joinToString(", "))
.append(")")
evaluateJavascript(sb.toString(), onResult)
}
반응형