딥링크(DeepLink)처리, SchemeActivity 하나로 끝내기
- Manifest에 딥링크 scheme을 각각 정의하지 않고 한군데서 처리합니다.
- 모든 딥링크를 한번에 파악하기 쉽고 정리하기 쉬워집니다.
- 딥링크화면이 종료될때 분기처리에 대한 고민을 해결해드립니다.
읽기전에
딥링크에 대해서 잘 모르시는 분들은 미리 딥링크의 개념과 구현에 대해서 익히신 뒤에 이 글을 읽어주셔야 합니다.📄🔍
열심히 개발하고 있던 어느날 기획팀👨💻👩💻에서 요청이 옵니다.
딥링크를 통해서 Detail화면을 실행하고 이름은 딥링크를 통해서 받을 수 있도록 해주세요
우리는 ‘후훗😎, 이정도야 쉽지' 라고 생각하며 딥링크를 정의하고 아래와 같은 패턴으로 만들게 됩니다.
ted://detail?name=ted
위와 같이 딥링크를 실행하는 경우 DetailActivity를 실행하고 uri로부터 name query파라미터를 가져와서 데이터를 set해주도록 설계하면 됩니다.
하지만 딥링크 처리 얼마나 잘하고 계신가요?
1. Scheme 관리😰
기능이 추가되고 화면이 복잡해 지면서 딥링크는 점점 많아 집니다.😰😰
ted://detail?name=ted
ted://country?id=korea
ted://car?id=modelx
ted://trade?id=1234567
딥링크가 많아지는만큼 AndroidManifest.xml에 정의된 코드도 점점 많아지고 복잡해집니다.
<activity android:name=".DetailActivity">
<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:host="detail"
android:scheme="ted" />
</intent-filter>
</activity>
<activity android:name=".CountryActivity">
<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:host="country"
android:scheme="ted" />
</intent-filter>
</activity>
...
...
...
...
또한 이런 딥링크들을 한눈에 확인하고 정리하고 싶어집니다.
2. 딥링크 종료 관리🤷♂️
기획팀에서 다시 요청이 옵니다.
1. 앱이 꺼져있다가 Detail화면이 실행된거면 종료될때 MainActivity를 띄우고
2. 앱이 실행중에 Detail화면이 실행된거면 해당 화면만 종료해주세요
이런 딥링크가 종료될때의 관리 어떻게 하고 계신가요?🤔
위의 2가지에 대한 고민을 해보신 분이라면 이 글이 도움이 될겁니다.
이미 이 고민을 해결하신 분이라도 이글이 도움이 될겁니다.(?)👻
저는 이러한 고민들을
SchemeActivity 하나로 딥링크 처리하면서 해결했습니다.
요약
SchemeActivity에서는 아래 흐름도대로 이루어져서 동작합니다.
바로 실행해보고 싶으신 분들은 아래 GitHub에서 확인하실 수 있습니다.
- Scheme 처리🔧
SchemeActivity가 ted://
로 시작하는 모든 scheme을 처리하도록 정의합니다.
<activity
android:name=".SchemeActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait">
<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="ted" />
</intent-filter>
</activity>
2. 딥링크 정의 ⭕️
DeepLinkInfo를 만들어서 관리 해줍니다.
앱에서 정의되어 있는 모든 딥링크를 정의하고 있고 실행된 Intent uri로부터 맞는 딥링크 intent를 가져오는 기능을 구현해줍니다.
3. 앱의 실행여부에 따라 분기↔️↕️
- 앱이 실행중일때 딥링크가 실행되었다면 해당 딥링크 화면만 실행하고 종료합니다.
- 앱이 처음 실행되었다면 딥링크 화면이 종료될때 메인화면이 실행되도록 추가해줍니다.
이때 딥링크로 실행해야 하는 인텐트가 Main일 경우도 있으므로 예외처리 코드도 추가해줘야 합니다.
if (메인 인텐트를 추가해야 하는가?) {
addNextIntentWithParentStack(메인 화면 인텐트)
}
테스트👀
아래 명령어를 통해서 실제 딥링크가 잘 실행되는지 확인해볼 수 있습니다.
adb shell am start -W -a android.intent.action.VIEW -d "ted://detail?name=ted" ted.gun0912.deeplink
더 자세한 딥링크 테스트 관련 글은 공식 문서를 살펴보시면 도움이 됩니다.
정리
위와 같은 구현을 통해 SchemeActivity에서 아래 순서 흐름도를 모두 처리하도록 구현 되었습니다.
이 SchemeActivity기반에 Firebase Dynamic Link처리까지 더해진다면 세상에서 가장 스마트한 딥링크/앱링크/다이나믹 링크를 구현하실 수 있습니다.
Firebase Dynamic Link에 대해 궁금하시다면 아래 블로그를 확인해주세요
각자 사용중인 딥링크 처리에 대한 노하우나 더 발전된 방식이 있다면 댓글을 통해서 공유해주시면 감사하겠습니다.🙏🙏
감사합니다.
제가 운영하고 있는 유튜브 채널 [개발자 테드박]에도 많은 관심 부탁드려요.
스타트업/개발자/IT 관련된 여러 영상을 올리고 있습니다.