관리 메뉴

나만을 위한 블로그

[Android] 딥링크로 url을 받았을 때 쿼리 파라미터에 & 기호가 여러 개 포함된 경우 처리 방법 본문

Android

[Android] 딥링크로 url을 받았을 때 쿼리 파라미터에 & 기호가 여러 개 포함된 경우 처리 방법

참깨빵위에참깨빵 2023. 11. 13. 22:09
728x90
반응형

예를 들어 아래와 같은 딥링크를 앱에서 받았다고 가정한다.

 

symbol://enterWindow?header=header&otherKey=otherValue&url=https://example.co.kr/enter?a=123&b=456&c=789

 

만약 이 딥링크 중 url이란 key의 value를 가져와야 한다면 어떻게 해야 할까? 간단하게 아래와 같이 할 수 있다.

 

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

    val deepLink: Uri = "symbol://enterWindow?header=header&body=body&url=https://example.co.kr/enter?a=123&b=456&c=789".toUri()
    val urlValue = deepLink.getQueryParameter("url")
    Timber.e("## urlValue : $urlValue")
}

 

 

실행시키고 빌드되는 걸 기다리면서 받을 것으로 예상하는 값은 아마 url 뒤의 "https://example.co.kr/enter?a=123&b=456&c=789"일 것이다. 하지만 결과는 내가 예상한 것과 다르다.

 

 

a의 값만 표시되고 b, c는 표시되지 않는다. 이렇게 표시되는 원인은 "&" 기호가 URI 쿼리 문자열에서 키밸류 쌍을 구분하는 구분자인데, b와 c가 새로운 쿼리 파라미터라고 간주되어 생략된 것이다.

그렇다고 URI를 바꿔달라고 할 필요는 없다. 아래 방법을 바탕으로 로직을 구성하면 완전한 URL을 얻을 수 있다.

 

class OtherActivity : BaseActivity<ActivityOtherBinding>(R.layout.activity_other) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val deepLink: Uri = "symbol://enterWindow?header=header&body=body&url=https://example.co.kr/enter?a=123&b=456&c=789".toUri()
        val encodedDeeplink = encodeUrlQueryParameter(deepLink.toString())
        if (encodedDeeplink.isNotEmpty()) {
            val urlValue = Uri.parse(encodedDeeplink).getQueryParameter("url")
            Timber.e("## urlValue : $urlValue")
        }
    }

    fun encodeUrlQueryParameter(deepLink: String): String {
        val urlIndex = deepLink.indexOf("url=")
        if (urlIndex == -1) return ""

        val beforeUrl = deepLink.substring(0, urlIndex + 4)
        val urlAndAfter = deepLink.substring(urlIndex + 4)

        val firstAmpIndex = urlAndAfter.indexOf("&")
        if (firstAmpIndex == -1) return ""

        val urlParam = urlAndAfter.substring(0, firstAmpIndex)
        val afterUrlParam = urlAndAfter.substring(firstAmpIndex).replace("&", "%26")

        return beforeUrl + urlParam + afterUrlParam
    }
}

 

딥링크가 deepLink 변수값과 같은 형태로 들어오고, 이 형태가 변경되지 않는다는 가정 하에서만 사용 가능한 로직이다.

그러나 앞서 말한대로 필요한 부분만 잘 골라내고, 필요하면 리턴타입과 리턴값을 변경한다면 자신의 상황에 맞게 커스텀해서 사용할 수 있을 것이다.

반응형
Comments