Skip to content
Star

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.kt

Android 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_MESSAGE response를 반환합니다.
  • payload 역직렬화가 실패하면 VALIDATION_FAILED를 반환합니다.
  • handler가 BridgeHandlerException을 던지면 지정한 code/message를 반환합니다.
  • 그 밖의 오류는 HANDLER_ERROR로 반환합니다.

신뢰하는 콘텐츠만 로드하세요

addJavascriptInterface는 네이티브 기능을 JavaScript에 노출합니다. 앱이 관리하는 HTTPS origin이나 번들 콘텐츠만 로드하고, 같은 WebView에서 임의의 외부 페이지로 이동하지 마세요.