Kotlin에서 사용하기
Android 런타임은 Kotlin으로 작성되어 있으며 WebView의 웹 메시지를 받아 request/command handler를 실행하고 event를 웹으로 보냅니다. TypeScript는 contract 분석과 Kotlin 코드 생성에만 사용됩니다.
설치
릴리스 전 개발 단계에서는 이 저장소를 Gradle composite build로 포함합니다.
kotlin
// settings.gradle.kts
includeBuild("../webview-bridge-kit") {
dependencySubstitution {
substitute(module("io.github.kimyounghee425:webview-bridge-kit"))
.using(project(":webview-bridge-kit-android"))
}
}kotlin
// app/build.gradle.kts
dependencies {
implementation("io.github.kimyounghee425:webview-bridge-kit:0.2.0")
}모듈은 Maven publication도 제공하므로 릴리스 저장소에 배포한 뒤에는 io.github.kimyounghee425:webview-bridge-kit:<version> 좌표를 사용할 수 있습니다.
contract가 있는 프로젝트에서 Kotlin 코드를 생성해 Android source set에 포함하세요.
bash
npx webview-bridge-kit-gen \
--contract ./bridge-contract.ts \
--lang kotlin \
--package com.example.bridge \
--out ./android/app/src/main/java/com/example/bridge/BridgeTypes.ktAndroid WebView 연결
kotlin
import androidx.lifecycle.lifecycleScope
import com.example.bridge.*
import dev.webviewbridgekit.AndroidWebViewTransport
import dev.webviewbridgekit.NativeBridge
class AppBridgeHandlers : BridgeHandlers {
override suspend fun kakaoLogin() =
KakaoLoginResponse(accessToken = login(), expiresIn = null, nickname = null)
override suspend fun sendLogs(payload: SendLogsPayload) {
logger.write(payload.lines)
}
override suspend fun openCamera() {
// 화면 전환
}
}
webView.settings.javaScriptEnabled = true
val transport = AndroidWebViewTransport(webView)
val bridge = NativeBridge(transport, lifecycleScope)
bridge.bind(AppBridgeHandlers())
bridge.emitPhotoTaken(photoPayload)화면이나 owner가 종료될 때 bridge.close()를 호출하세요. 기본 웹 transport는 window.WebViewBridgeKit을 자동 감지합니다. 다른 interface 이름을 쓰면 웹에 custom Transport를 전달해야 합니다.
오류 처리
- 등록되지 않은 request는
UNKNOWN_MESSAGEresponse를 반환합니다. - payload 역직렬화가 실패하면
VALIDATION_FAILED를 반환합니다. - handler가
BridgeHandlerException을 던지면 지정한 code/message를 반환합니다. - 그 밖의 오류는
HANDLER_ERROR로 반환합니다.
신뢰하는 콘텐츠만 로드하세요
addJavascriptInterface는 네이티브 기능을 JavaScript에 노출합니다. 앱이 관리하는 HTTPS origin이나 번들 콘텐츠만 로드하고, 같은 WebView에서 임의의 외부 페이지로 이동하지 마세요.