Search
📱

딥링크 연결하기

날짜
2024/10/10
파트
안드로이드
서기
블로그 업로드 여부

딥링크 왜 필요함?

우리 서비스에서 필요한 이유 블라 블라
uri 와 url 의 차이?
인텐트란?

그래서 구현 어떻게?

딥링크를 위한 url 만들기!

Manifest 설정하기

<activity android:name=".presentation.view.MainActivity" android:exported="true" android:windowSoftInputMode="stateAlwaysHidden|adjustPan"> <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="http" android:host="13.124.137.6" android:pathPattern="/read-only/web/offerings/.*" /> </intent-filter> </activity>
Markdown
복사

1. <action android:name="android.intent.action.VIEW" />

이 부분은 딥 링크 인텐트 필터가 어떤 작업을 처리할지를 정의합니다.
*android.intent.action.VIEW*는 안드로이드에서 URL을 통해 콘텐츠를 보기 위한 일반적인 액션입니다. 이 설정을 통해 앱이 URL을 열 때의 동작을 정의하게 됩니다.

2. <category android:name="android.intent.category.DEFAULT" />

DEFAULT 카테고리는 기본적으로 인텐트 필터를 통해 실행될 수 있는 액션이라는 것을 나타냅니다.
앱이 해당 인텐트를 수신할 준비가 되어 있음을 알리기 위한 필수 설정입니다.

3. <category android:name="android.intent.category.BROWSABLE" />

BROWSABLE 카테고리는 이 인텐트가 웹 브라우저에서 실행될 수 있음을 의미합니다.
이를 통해, 브라우저에서 클릭한 링크가 이 앱을 열 수 있게 허용합니다.
예를 들어, 사용자가 웹 브라우저에서 URL을 클릭했을 때 이 카테고리가 없으면 브라우저는 앱을 열지 않고 웹 페이지로 이동할 수 있습니다. 이 카테고리가 있어야 브라우저가 앱으로의 전환을 허용합니다.

4. <data android:scheme="http"

이 속성은 앱이 처리할 URL의 스킴(scheme)을 정의합니다.
*http*는 URL 스킴으로, 사용자가 **http://**로 시작하는 링크를 클릭할 때 이 앱이 해당 링크를 처리할 수 있음을 정의합니다.
이를 통해 HTTP 링크를 처리할 수 있게 설정하는 것이죠. HTTPS를 지원하려면 추가적으로 android:scheme="https"도 설정해야 합니다.

5. android:host="13.124.137.6"

*host*는 이 인텐트 필터가 처리할 URL의 **호스트(서버)**를 정의합니다.
여기서는 **13.124.137.6*이라는 IP 주소를 지정했습니다. 즉, 이 인텐트 필터는 이 IP 주소를 사용하는 URL을 처리합니다.
호스트는 IP 주소 대신 도메인 이름(예: www.example.com)으로도 설정할 수 있습니다.

6. android:pathPattern="/read-only/web/offerings/.*"

*pathPattern*은 앱이 처리할 URL의 경로 패턴을 정의합니다. 여기서는 **/read-only/web/offerings/*로 시작하고 뒤에 어떤 값이 올 수 있는 경로를 의미합니다.
.*는 정규 표현식으로, 모든 문자열이 이 경로 뒤에 올 수 있음을 나타냅니다.
예를 들어, http://13.124.137.6/read-only/web/offerings/123 또는 http://13.124.137.6/read-only/web/offerings/456 같은 URL이 이 필터에 해당되어 앱이 실행됩니다.

연결한 페이지로 이동하기!

MainActivity 위의 OfferingDetailFragment 로 이동을 하는 로직 구현
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 기타 코드 handleDeepLink(intent) }
Kotlin
복사
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) handleDeepLink(intent) } private fun handleDeepLink(intent: Intent) { val data: Uri? = intent.data data?.let { if (it.pathSegments.contains("offerings")) { val offeringIdStr = it.lastPathSegment val offeringId = offeringIdStr?.toLongOrNull() if (offeringId != null) { openOfferingDetailFragment(offeringId) } else { Toast.makeText(this, "Invalid offering ID", Toast.LENGTH_SHORT).show() } } } } private fun openOfferingDetailFragment(offeringId: Long) { val fragment = OfferingDetailFragment().apply { arguments = bundleOf(OfferingDetailFragment.OFFERING_ID_KEY to offeringId) } supportFragmentManager.beginTransaction() .replace(R.id.nav_host_fragment_container, fragment) .commitAllowingStateLoss() }
Kotlin
복사

Deep link 에뮬레이터로 테스트해보기

adb 디버깅 사용
터미널에 명령어 작성
adb shell am start -a android.intent.action.VIEW \ -d "http://13.124../..(당신의 딥링크 url)" \ com.어쩌구.저쩌구(당신의 패키지)
Markdown
복사
원하는 페이지로 연결되었는지 확인 가능!

서버에서 리다이렉션 해줘야함

<data android:scheme="chongdaeapp" android:host="offerings" android:pathPattern="/.*" />
로 변경
intent://offerings/1000034#Intent;scheme=chongdaeapp;package=com.zzang.chongdae;end 이런 형식으로 변경