(Android/안드로이드) Scheme 파싱하는 법 - 딥링크 스킴 파싱

✨ 개요

안드로이드에서 “앱을 특정 화면으로 바로 열기”를 구현할 때 가장 자주 등장하는 키워드가 스킴(scheme) 딥링크입니다. 예를 들어 아래 링크를 누르면 앱이 열리면서 특정 화면으로 이동하게 만들 수 있습니다.

그런데 실제 구현 단계에서 많은 개발자가 헷갈려 하는 부분이 있습니다.


1. 요약


2. 스킴 딥링크 구성요소: scheme / host / path / query

myapp://host-action/path/to/screen?val=123&foo=bar
구성요소 예시 의미
scheme myapp 어떤 프로토콜/앱인지 식별
host host-action 앱 내부에서 큰 분기 기준으로 사용
path /path/to/screen 세부 화면 라우팅에 사용
query param val=123 화면에 전달할 데이터

안드로이드에서 이 값들은 대부분 Uri로 파싱합니다.


3. Intent에서 딥링크 정보 꺼내기: action vs data(Uri)

딥링크로 앱이 실행되면 보통 Activity.onCreate() 또는 onNewIntent()에서 Intent를 받습니다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    handleDeepLink(intent)
}

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    handleDeepLink(intent)
}

4. 실무 파싱 패턴 1: host 기반 라우팅 (host-action 스타일)

구조

이 방식은 가능하지만, 권장되는 안정적 접근은 아래처럼 Uri를 기준으로 분해하는 것입니다.

test://host-action?val=hello

private fun handleDeepLink(intent: Intent) {
    val uri = intent.data ?: return
    val scheme = uri.scheme ?: return
    val host = uri.host ?: return

    if (scheme != "test") return

    when (host) {
        "host-action" -> {
            val value = uri.getQueryParameter("val")
            // value로 화면 이동/로직 처리
            navigateHostAction(value)
        }
        else -> {
            // unknown host
        }
    }
}

5. 실무 파싱 패턴 2: path 기반 라우팅 (권장 구조)

Host는 도메인처럼 고정하고, path로 화면을 나누는 방식이 유지보수에 유리합니다.

when (uri.host) {
    "open" -> {
        when (uri.path) {
            "/profile" -> {
                val id = uri.getQueryParameter("id") ?: return
                openProfile(id)
            }
            "/settings" -> openSettings()
            "/web" -> {
                val url = uri.getQueryParameter("url") ?: return
                openWeb(url)
            }
        }
    }
}

6. 파싱 시 주의사항 (실무에서 많이 터지는 것들)



Related Posts