Dari

DariInterceptor API

브릿지 메시지 캡처를 위한 인터페이스 및 기본 구현체

이 페이지는 기본 방식인 직접 호출을 다룹니다. 브릿지 코드에 Dari 호출 없이 캡처하려면, 의존성은 그대로 두고 Gradle 플러그인을 추가하세요. 플러그인이 같은 호출을 대신 넣어 줍니다.

인터페이스

interface DariInterceptor {
    val tag: String? get() = null

    fun onWebToAppRequest(
        handlerName: String,
        requestId: String?,
        requestData: String?,
        fireAndForget: Boolean? = null,
    )

    fun onWebToAppRequest(
        handlerName: String,
        displayName: String?,
        requestId: String?,
        requestData: String?,
        fireAndForget: Boolean? = null,
    )

    fun onWebToAppResponse(
        handlerName: String,
        requestId: String?,
        responseData: String?,
        isSuccess: Boolean,
    )

    fun onAppToWebRequest(
        handlerName: String,
        requestId: String?,
        data: String?,
        fireAndForget: Boolean? = null,
    )

    fun onAppToWebRequest(
        handlerName: String,
        displayName: String?,
        requestId: String?,
        data: String?,
        fireAndForget: Boolean? = null,
    )

    fun onAppToWebResponse(
        requestId: String?,
        isSuccess: Boolean,
        responseData: String?,
    )
}

DefaultDariInterceptor

DefaultDariInterceptor는 디버그 구현체입니다. 메시지를 Dari의 Room 데이터베이스에 저장하고 알림을 표시합니다.

val interceptor = Dari.createInterceptor(tag = "PaymentBridge")

앱 코드에서는 Dari.createInterceptor()를 사용해야 릴리즈 빌드가 dari-noop과 함께 컴파일됩니다. 선택적 tag를 사용하면 앱에 여러 인터셉터가 활성화된 경우 브릿지 소스별로 메시지를 구분할 수 있습니다.

Protocol Buffers (선택 사항)

protobuf 검사에는 별도 feature flag가 없으며 기존 String/JSON API를 대체하지 않습니다. 활성화 조건, decoder 설정, 브릿지 전송 방식 및 모든 요청/응답 메서드는 Protocol Buffers 가이드를 참고하세요.

메서드

onWebToAppRequest

JavaScript가 네이티브 앱으로 메시지를 보낼 때 호출합니다. 모든 요청이 들어오는 진입점에서 핸들러로 넘기기 전에 한 번 호출합니다.

파라미터타입설명
handlerNameString브릿지 핸들러 이름
requestIdString?요청-응답 쌍을 식별하는 고유 ID. null = 단독 메시지
requestDataString?요청 페이로드
fireAndForgetBoolean?null = 전역 설정 사용, true = 즉시 완료, false = 응답 대기

onWebToAppResponse

네이티브 앱이 JavaScript로 응답을 보낼 때 호출합니다. 모든 응답을 보내는 함수 한 곳에서 호출하면 핸들러마다 호출할 필요가 없습니다.

파라미터타입설명
handlerNameString요청과 일치해야 함
requestIdString?요청의 requestId와 일치해야 함
responseDataString?응답 페이로드
isSuccessBooleantrue → SUCCESS, false → ERROR

onAppToWebRequest

네이티브 앱이 JavaScript로 메시지를 푸시할 때 호출합니다. 웹으로 메시지를 보내는 함수에서 호출합니다.

onAppToWebResponse

JavaScript가 네이티브 앱의 요청에 응답할 때 호출합니다. 웹의 응답이 도착하는 지점에서 호출합니다.

선택적 표시 이름

안정적인 핸들러 식별자에 읽기 쉬운 이름을 함께 표시하려면 displayName이 있는 요청 overload를 사용합니다:

interceptor?.onWebToAppRequest(
    handlerName = "N:4-1",
    displayName = "오늘의 건강목표",
    requestId = requestId,
    requestData = payload,
)

Dari는 두 값을 분리하여 저장·내보내고 검색 시 두 값 모두를 확인합니다. 목록과 알림에는 N:4-1(오늘의 건강목표)로 표시됩니다. 공백 표시 이름은 null처럼 처리합니다. App-to-Web 및 protobuf 요청에도 같은 overload를 사용할 수 있으며 기존 시그니처도 계속 지원합니다.

페이지 URL과 origin

페이지를 전달하면 각 메시지에 어느 웹 배포에서 왔는지 기록됩니다. SPA 히스토리 변경에도 호출되는 doUpdateVisitedHistory를 WebView가 이미 쓰는 WebViewClient에 추가하세요. 새 client를 지정하면 기존 내비게이션·인증 콜백이 사라집니다:

override fun doUpdateVisitedHistory(view: WebView, url: String?, isReload: Boolean) {
    super.doUpdateVisitedHistory(view, url, isReload)
    interceptor?.onPageUrlChanged(url)
}

이후 캡처되는 요청에는 자격 증명이나 토큰이 담길 수 있는 user info, query, fragment를 뺀 URL이 저장됩니다. 두 인스펙터 모두 상세 화면에 표시하고, origin이 둘 이상이면 origin 필터를 보여주며, Response Time 통계도 선택한 origin 기준으로 계산합니다. export에는 page_url로 포함됩니다. 페이지끼리 덮어쓰지 않도록 WebView마다 인터셉터를 하나씩 쓰세요.

Fire-and-Forget (단방향 호출)

응답을 받지 않는 단방향 호출은 즉시 SUCCESS로 처리되도록 설정할 수 있습니다:

// 개별 호출
interceptor?.onWebToAppRequest(
    handlerName = "logEvent",
    requestId = null,
    requestData = """{"event": "button_click"}""",
    fireAndForget = true,
)

// 전역 설정: 모든 호출에 적용
DariConfig(fireAndForget = true)

On this page