딥링크(DeepLink)처리, SchemeActivity 하나로 끝내기

Ted Park
박상권의 삽질블로그
8 min readFeb 12, 2020

--

- 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에서 확인하실 수 있습니다.

  1. 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에 대해 궁금하시다면 아래 블로그를 확인해주세요

각자 사용중인 딥링크 처리에 대한 노하우나 더 발전된 방식이 있다면 댓글을 통해서 공유해주시면 감사하겠습니다.🙏🙏

감사합니다.

--

--