🌈🌈 상상을 해봅시다.
배민이나 쿠팡에서 원하는 뭔가를 구매하려고 합니다. 💸💸
원하는 상품을 신중하게 선택하고
결제를 진행해야겠죠!
결제를 할 때 대부분 어떻게 진행되나요?
💳 카드사를 선택하고
해당 카드사의 앱으로 바로 이동되어
카드사 앱에 해당 결제 내용이 바로 전달되어 보이고
결제 후 돌아오면 결제 완료에 대한 정보가 또 전달되죠
이렇게 앱과 앱 사이의 호출 또는 정보 전달하는 연결
바로 DeepLink입니다❗️
우리는 모두 알게 모르게
안드로이드 앱에서 Deep Link를 통하여
다른 앱을 호출하는 경험에 익숙해져 있습니다.
이번에는 Android Deep Link에 대하여 알아보겠습니다.
Deep Link 호출
위에서 이야기했던 예시를 다시 한번 가져오겠습니다.
결제를 하기 위하여 카드 앱으로 이동을 해야 합니다.
그렇다면 쇼핑앱에서 카드사 앱을 호출해줘야겠죠?
val uri = Uri.parse("해당 앱의 Deep Link - scheme://host")
val i = Intent(Intent.ACTION_VIEW, uri)
i.setPackage("해당 앱의 패키지 명")
startActivity(i)
Intent 호출 방법을 통하여 호출할 앱의 Deep Link형식과 PackageName만 알고 있다면
언제든 호출 가능합니다.
그래도 이해가 안 되신다면
val uri = Uri.parse("https://instagram.com/")
val i = Intent(Intent.ACTION_VIEW, uri)
i.setPackage("com.instagram.android")
startActivity(i)
이와 같이 Intent 호출을 하면 인스타 앱이 바로 열리는 걸 확인할 수 있습니다.
Deep Link 수신
결제하기 위하여 💳 카드사 앱을 호출했습니다.
카드사 앱에서는 열리기만 하면 될까요??
우리가 결제할 때를 잘 생각해보면
앱이 열리고 결제의 대한 데이터들이 그대로 넘어오는 걸 알 수 있습니다.
우리는 단순하게 결제만 하면 되는 거였죠
Deep Link는 호출하는 앱뿐만 아니라
수신받는 앱에서도 작업이 필요합니다.
Deep Link를 정상적으로 수신받기 위해서는 몇 가지 준비가 필요합니다.
AndroidManifest.xml
<activity
android:name=".ui.activity.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 딥링크 수신 정의 -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="ys_weather"
android:host="testlink"/>
</intent-filter>
</activity>
우선 AndroidManifest에서 DeepLink scheme와 host를 정의해줍니다.
아까 위에서 DeepLink 호출할 때 scheme://host 값으로 호출되는 걸 알 수 있었습니다.
그렇다면 위와 같이 작업된 앱을 호출하려면
val uri = Uri.parse("ys_weather://testlink")
val i = Intent(Intent.ACTION_VIEW, uri)
i.setPackage("yellow.sun.dev.weather")
startActivity(i)
"ys_weather://testlink" 그리고 PackageName 값을 이용합니다.
또한 <inter-filter> data scheme/host 정의를
<activity> .MainActivity 안에 했기 때문에
"ys_weather://testlink" 해당 값으로 호출하면
수신받게 되는 Activity는 MainActivity가 됩니다.
MainActivity.kt
private fun handleDeepLink() {
val deepLink: Uri? = intent.data
// return "ys_weather://testlink"
}
또한 단순하게 앱이 호출되는 것뿐 아니라
정보들을 같이 넘겨줄 수 있다고 했습니다.
scheme://host?data1=""&data2=""....
이와 같은 방식으로 데이터들을 같이 전송할 수 있고
수신받는 부분에서는 getQueryParameter()를 사용하여
원하는 데이터 값을 받을 수 있습니다.
ex) ys_weather://testlink?age=29&name=KIU
private fun handleDeepLink() {
val deepLink: Uri? = intent.data
val age = deepLink?.getQueryParameter("age") ?: ""
val name = deepLink?.getQueryParameter("name") ?: ""
}
추가적인 궁금점들은
아래 DeepLink 테스트를 진행하면서
알아보겠습니다.
Deep Link Test
Android Developer 사이트의 문서에 보면
adb 명령어를 통하여 딥링크에 대한 테스트 진행을 소개하고 있습니다.
그렇다면 한번 진행해 볼까요?
바로 위에서 scheme://host?data1=""&data2=""
이와 같은 방식으로 데이터 정보도 같이 보내준다고 했습니다.
ys_weather://testlink?age=29&name=KIU
나이와 이름값을 받아보겠습니다.
(앱이 모두 종료되어 있는 상태 즉 스마트폰 메인화면에서 그대로 호출 가능합니다.)
private fun handleDeepLink() {
val deepLink: Uri? = intent.data
L.d("handleDeepLink deepLink : $deepLink")
val age = deepLink?.getQueryParameter("age") ?: ""
val name = deepLink?.getQueryParameter("name") ?: ""
L.d("handleDeepLink age : $age")
L.d("handleDeepLink name : $name")
}
adb shell am start -W -a android.intent.action.VIEW -d "ys_weather://testlink?age=29&name=KIU" yellow.sun.dev.weather
정상적으로 앱이 열렸고 값도 수신했습니다.
그런데❗️
여기서 문제가 발생했습니다.
위에서 찍었던 로그를 확인해보면
handleDeepLink deepLink : ys_weather://testlink?age=29
handleDeepLink age : 29
handleDeepLink name : ❗️
ys_weather://testlink?age=29&name=KIU 이 부분에서
&name=KIU 이름에 해당되는 데이터가 들어오지 않았습니다.
adb 명령어를 통한 테스트에서는
&앞에 \를 추가하여 진행해야 합니다.
adb shell am start -W -a android.intent.action.VIEW -d "ys_weather://testlink?age=29\&name=KIU" yellow.sun.dev.weather
이렇게 테스트를 진행한다면
모두 정상적으로 동작하게 됩니다.
안드로이드 스튜디오 디버깅 관련 자료는 어떠신가요?? 💁♂️💁♂️
여기까지 저의 긴 글을 읽어주셔서 감사합니다.
제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.
'Android > 스터디 노트' 카테고리의 다른 글
Android13(SDK33) 이미지 및 사진 권한 (READ_EXTERNAL_STORAGE, READ_MEDIA_IMAGES) (12) | 2023.01.13 |
---|---|
[Android] DataBinding 활용하기(1) - @BindingAdapter 매개변수 두개 이상 활용 (0) | 2022.12.19 |
Android PhotoPicker 권한 없이 갤러리에서 이미지 가져오기/이미지 다중 선택 (0) | 2022.11.15 |
Android 13 Notification Permission 알림 권한 띄우기. (8) | 2022.11.08 |
안드로이드 앱 권한 및 거부 처리 Android Permission Check. (0) | 2022.11.05 |
최근댓글