본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Android][kotlin] Firebase DynamicLink (동적링크) 만들기 - 2편

by MinChan-Youn 2022. 2. 28.

Firebase DynamicLink(동적링크) - 1편(Firebase 환경설정): https://minchanyoun.tistory.com/103

Firebase DynamicLink(동적링크) - 2편(안드로이드 앱 구축): https://minchanyoun.tistory.com/104

 

Firebase DynamicLink(동적링크)에 대해서 알아보겠습니다.

Firebase DynamicLink(동적링크)는 앱 설치 여부에 관계 없이 여러 플랫폼에서 원하는 대로 작동하는 링크입니다.

 

동적 링크를 사용하면 사용자가 링크를 연 플랫폼에 가장 적합한 환경을 제공할 수 있습니다. iOS 또는 Android에서 동적 링크를 연 사용자를 네이티브 앱 내 링크된 콘텐츠로 곧장 이동시킬 수 있습니다. 같은 동적 링크를 데스크톱 브라우저에서 열었다면 웹사이트 내 해당 콘텐츠로 안내할 수 있습니다.

또한 동적 링크는 앱 설치 여부에 따라 적절히 작동합니다. iOS 또는 Android에서 앱을 설치하지 않은 사용자가 동적 링크를 열면 앱을 설치하는 화면으로 안내됩니다. 앱을 설치하고 나서 동적 링크를 열면 앱이 시작되고 링크에 액세스할 수 있습니다.

 

<참고자료>

Firebase Google -> https://firebase.google.com/docs/dynamic-links?hl=ko

 

 

Android App 설정

Android App 설정부분을 코드를 보면서 따라가겠습니다.

 

AndroidManifest.xml

*DynamicLink <intent-filter> 추가

...

            <!-- DynamicLink -->
            <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="https" android:host="shopping.naver.com/home"/>
                <data android:scheme="http"  android:host="shopping.naver.com/home"/>
            </intent-filter>
...

 

 

build.gradle(Project)

*빌드 종속항목 추가

...
buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.3.10' //DynamicLink
    }
}
...

 

build.gradle(Module)

*plugins, dependencies 추가

plugins {
	...
    id 'com.google.gms.google-services' //DynamicLink
}



dependencies {

	...

    //TODO: DynamicLink관련 / Firebase 및 동적 링크 SDK 설정
    implementation platform('com.google.firebase:firebase-bom:29.1.0')
    implementation 'com.google.firebase:firebase-dynamic-links'
    implementation 'com.google.firebase:firebase-analytics-ktx'
    
    ...
}

 

MainActivity.kt

* 딥링크 수신, 다이나믹링크 생성 코드작성

class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //딩링크 수신
        initDynamicLinks()

        //동적링크만들기
//        var deepLinkStr = createDynamicLink()
//        Log.e("YMC", "DeepLinkStr: ${deepLinkStr}")
    }

    /** DynamicLink */
    /** Firebase쪽 부분이 제대로 설정이 되었다는 전제
     * (설명)
     * 단축URL: https://dynamiclink2022.page.link/main       ("~~~.page.link" -> firebase쪽에서 제공하는 url)
     * 딥링크: https://shopping.naver.com/home/p/index.naver  (앱내 딥링크가 존재하지 않을시 다른URL로 돌아가는 것을 확인하기 위해 naverShopping으로 임시 지정)
     *
     * 단축URL을 앱 또는 브라우저에서 실행 시 -> Firebase쪽에서 수신을 통해 딥링크로 변경을 해줌
     * firebase쪽에서 Flow가 어떻게 돌아가는지 확인 할 수 있으며
     * 또 해당 딥링크로 변환했을시 앱에서 scheme를 "https", host를 "shopping.naver.com/home"으로 해당되는 딥링크를 수신처리
     * 만약 해당되는 앱이 없을 시 딥링크 URL를 그대로 띄우거나 구글, 앱 스토어마켓으로 이동시킴! */
    fun initDynamicLinks() {
        /** 딥링크 수신*/
        FirebaseDynamicLinks.getInstance()
            .getDynamicLink(intent)
            .addOnSuccessListener {
                var dynamicLink: Uri? = null
                if (it != null) {
                    /** 딥링크 데이터 수신성공 */
                    dynamicLink = it.link
                    Log.e("YMC","dynamicLink: $dynamicLink")
                    Log.e("YMC","path: ${dynamicLink?.path}")
                    binding.tvDynamicLinkReceive.text = "다이나믹링크 수신받은 데이터: ${dynamicLink?.path}" //ex) "/home/p/index.naver"

//                    val eventNo = dynamicLink?.path!!.replace("/data/", "")
//                    Log.e("YMC","eventNo: ${eventNo}")
                } else {
                    /** 딥링크 데이터 수신실패 */
                    // handle
                }
            }
            .addOnFailureListener {
                // handle
            }
    }

    /**긴 동적 링크만들기 - Firebase에서 직접만들면 이코드는 필요 없음!
     * https://dynamiclink2022.page.link/main?apn=com.example.dynamiclink_kotlin&link=https%3A%2F%2Fshopping.naver.com%2Fhome%2Fp%2Findex.naver/event/1 */
    private val DEEPLINK_URL = "https://shopping.naver.com/home/p/index.naver" //딥 링크
    private val SHORT_DYNAMIC_LINK = "https://dynamiclink2022.page.link/main"  //짧은 동적 링크
    private val PACKAGE_NAME = "com.example.dynamiclink_kotlin"

    private fun createDynamicLink(): String {
        return FirebaseDynamicLinks.getInstance()
            .createDynamicLink()
            .setLink(Uri.parse(DEEPLINK_URL))
            .setDomainUriPrefix(SHORT_DYNAMIC_LINK)
            .setAndroidParameters(
                DynamicLink.AndroidParameters.Builder(PACKAGE_NAME)
                    .build()
            )
            .buildDynamicLink()
            .uri.toString()
//            .uri.toString() + "/event/1"  //  https://DEEPLINK_URL/event/1 의 형태로 만들기 위해 추가
    }
//

    //구 버전 백업
//    private val DEEPLINK_URL = "https://deeplink2022.page.link/data/123" //딥 링크
//    private val SHORT_DYNAMIC_LINK = "https://deeplink2022.page.link/1"  //짧은 동적 링크
//    private val PACKAGE_NAME = "com.example.deeplink_receive"
//
//    private fun createDynamicLink(): String {
//        return FirebaseDynamicLinks.getInstance()
//            .createDynamicLink()
//            .setLink(Uri.parse(DEEPLINK_URL))
//            .setDomainUriPrefix(SHORT_DYNAMIC_LINK)
//            .setAndroidParameters(
//                DynamicLink.AndroidParameters.Builder(PACKAGE_NAME)
//                    .build()
//            )
//            .buildDynamicLink()
//            .uri.toString()
////            .uri.toString() + "/event/1"  //  https://URL/event/3 의 형태로 만들기 위해 추가
//    }
}

 

 

구현화면

* DynamicLink 수신 전 / 후

 

<총 정리>

예를 들면 firebase에 등록된 단축URL: "https://dynamiclink2022.page.link/main"을 호출하면 firebase에서 확인하여 딥링크인 "https://shopping.naver.com/home/p/index.naver"으로 딥링크를 변환해준다.

앱 내부에서는 https 스키마와 shopping.naver.com인 host를 확인하고 실제 그뒤로부터있는 home/p/index.naver를 데이터로 인식

 

 

 

 

글 정리 & 소스코드

 

[정리]

Firebase DynamicLink(동적링크) - 1편(Firebase 환경설정): https://minchanyoun.tistory.com/103

Firebase DynamicLink(동적링크) - 2편(안드로이드 앱 구축): https://minchanyoun.tistory.com/104

 

[소스코드]

https://github.com/younminchan/kotlin-study/tree/main/DynamicLink_kotlin

 

GitHub - younminchan/kotlin-study: kotlin-example

kotlin-example. Contribute to younminchan/kotlin-study development by creating an account on GitHub.

github.com

 

 

질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!

응원의 댓글은 저에게 큰 힘이 된답니다! :)

즐거운 하루되세요!

 

깃허브 보러 놀러오세요 👇 (맞팔환영)

https://github.com/younminchan

 

younminchan - Overview

안드로이드 2년차 개발자 •⚽️/🎤/🥁/🖥/🏃‍♂️/🚴‍♂️/🤟 TechBlog⬇️ minchanyoun.tistory.com - younminchan

github.com