Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 안드로이드 유닛 테스트 예시
- jvm이란
- ANR이란
- rxjava cold observable
- android ar 개발
- rxjava hot observable
- 안드로이드 레트로핏 crud
- 안드로이드 라이선스 종류
- 안드로이드 레트로핏 사용법
- 스택 자바 코드
- 안드로이드 유닛테스트란
- 멤버변수
- 큐 자바 코드
- rxjava disposable
- 객체
- 2022 플러터 설치
- 클래스
- Rxjava Observable
- android retrofit login
- 서비스 vs 쓰레드
- 안드로이드 유닛 테스트
- 안드로이드 os 구조
- 2022 플러터 안드로이드 스튜디오
- 서비스 쓰레드 차이
- 안드로이드 라이선스
- 플러터 설치 2022
- 자바 다형성
- ar vr 차이
- jvm 작동 원리
- 스택 큐 차이
Archives
- Today
- Total
나만을 위한 블로그
[Android] 딥링크로 url을 받았을 때 쿼리 파라미터에 & 기호가 여러 개 포함된 경우 처리 방법 본문
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 변수값과 같은 형태로 들어오고, 이 형태가 변경되지 않는다는 가정 하에서만 사용 가능한 로직이다.
그러나 앞서 말한대로 필요한 부분만 잘 골라내고, 필요하면 리턴타입과 리턴값을 변경한다면 자신의 상황에 맞게 커스텀해서 사용할 수 있을 것이다.
반응형
'Android' 카테고리의 다른 글
[Android] shouldOverrideUrlLoading()이란? (0) | 2023.11.21 |
---|---|
[Android] BottomSheetDialogFragment 스크롤 시 내부 요소가 스크롤되게 하는 법 (0) | 2023.11.16 |
[Android] onNewIntent()란? (0) | 2023.11.13 |
[Android] UseCase에서 invoke를 사용하는 이유 (with 클린 아키텍처) (0) | 2023.11.12 |
[Android] 폴더블 기기 펼침 여부 확인하는 방법 (Jetpack WindowManager) (0) | 2023.11.08 |
Comments