딥링크 왜 필요함?
우리 서비스에서 필요한 이유 블라 블라
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
이런 형식으로 변경
