🌈🌈  상상을 해봅시다.

 

배민이나 쿠팡에서 원하는 뭔가를 구매하려고 합니다.  💸💸

원하는 상품을 신중하게 선택하고

결제를 진행해야겠죠!

 

결제를 할 때 대부분 어떻게 진행되나요?

 

💳 카드사를 선택하고

해당 카드사의 앱으로 바로 이동되어

카드사 앱에 해당 결제 내용이 바로 전달되어 보이고

결제 후 돌아오면 결제 완료에 대한 정보가 또 전달되죠

 

이렇게 앱과 앱 사이의 호출 또는 정보 전달하는 연결

바로 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 schemehost를 정의해줍니다.

아까 위에서 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] Android Debug Mode 잘 활용하기 (안드로이드 스튜디오 디버깅)

안드로이드 스튜디오 디버깅 어떻게 사용하고 계신가요?? 🧑‍💻🧑‍💻 via GIPHY 혹시 디버깅 모드 🔴 'Break Point'(중단점) 생각하고 계신가요?? (저도 디버깅 모드 사용하면 브레이크 포인트만

salmonpack.tistory.com

 

 

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 해보겠습니다.

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기