안드로이드 기기 사용자는 앱에서 링크를 클릭해서 다른 앱이나 웹 페이지로 이동할 수 있다.
대표적인 예시로 웹 페이지에서 어떤 상품의 구매 버튼을 누르면 쿠팡 등 연관된 쇼핑몰 앱으로 이동한다던지 하는 상황을 스마트폰을 사용하다보면 어렵지 않게 겪을 수 있다.
이러한 경우 단순히 앱을 실행만 되는 게 아니라 앱의 특정 페이지로 정확히 사용자를 이동시켜주는 것을 알 수 있는데 이는 해당 링크가 앱의 특정 콘텐츠로 연결해주는 딥 링크이기 때문이다.
안드로이드 개발자는 매니페스트
에서 웹사이트 URI의 인텐트 필터를 만들고 인텐트에서 얻은 데이터를 사용할 앱을 구성함으로써 사용자가 앱의 특정 콘텐츠로 안내할 수 있도록 구현할 수 있다.
안드로이드 딥 링크에 대해 알아보기 전 URI와 URL의 차이. 그리고 URL의 구성요소들에 대해 간단히 짚어보자.
URI
는 특정 리소스를 식별하는 통합 자원 식별자(Uniform Resource Identifier)를 의미한다. 웹에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스이다.
URL
은 웹 주소라고도 부르며, 컴퓨터 네트워크 상에서 리소스가 어디 있는지 알려주기 위한 규약이다. URI의 서브셋이다.
얼핏 보면 비슷한 의미로 보이지만 둘의 가장 큰 차이점은 URI는 식별하고 URL은 위치를 가리킨다는 것이다.
사람으로 비유를 해보자면 URI는 사람을 특정할 수 있는 주민등록번호
같은 개념이며 URL은 해당 사람의 위치 즉, 주소
를 나타내는 정보이다.
HTTP 또는 HTTPS 상에서 URL은 주로 아래와 같은 4가지 요소로 구성되어 있다.
스키마
는 인터넷 상에서 리소스에 접근하기 위한 프로토콜 식별자이다. 웹 상에서는 주로 HTTP
나 HTTPS
가 많이 사용된다. 하지만 Android 딥 링크에서는 HTTP
나 HTTPS
가 아닌 고유 식별자를 사용할 수도 있다.호스트
는 해당 리소스의 주인을 식별할 수 있는 식별자이다. https://www.example.com
라는 URL에서 www.example.com
이 호스트 값이 된다. 웹 상에서 호스트
는 해당 웹사이트의 IP 주소로 맵핑되지만 1대1 연결 관계는 아니다. (하나의 IP 주소가 여러 호스트에 맵핑될 수 있다.)패스
는 호스트
내부에서 리소스에 접근하기 위한 세부적인 위치를 알려준다. 쿼리 스트링
은 패스
뒤에 따라오며 패스
가 접근하고자 하는 리소스에 대해서 활용할 수 있는 문자열 정보를 제공한다. (ex. 찾고자 하는 리소스에 조건을 걸어 탐색하거나 정렬 조건을 제공할 수 있다.)링크를 클릭하거나 프로그램이 웹 URI 인텐트를 호출하면 Android 시스템에서 성공할 때까지 아래 요청을 순서대로 시도한다.
딥 링크
를 만들려면 아래의 요소와 속성값이 포함된 인텐트 필터
를 매니페스트
에 추가해야한다.
<action>
Google 검색에서 인텐트 필터에 도달할 수 있도록 ACTION_VIEW
인텐트 작업을 지정한다.
<data>
최소 하나 이상의 <data>
태그를 추가한다. 각 태그는 활동으로 확인되는 URI 형식을 나타낸다. <data>
태그에는 최소한 android:scheme
속성이 포함되어야 한다.
속성을 추가하여 URI 유형을 더욱 세분화할 수 있다. 예를 들어, 유사한 URI를 수락하지만 경로 이름에 따라 달라지는 여러 활동이 있을 경우 android:path
속성이나 pathPattern', 'pathPrefix
등을 사용하여 다양한 URI 경로에 대해 활동을 구분할 수 있다.
<category>
BROWSABLE
카테고리를 포함한다. 이 속성이 있어야 웹브라우저에서 인텐트 필터에 액세스할 수 있다. 이 카테고리가 없을 경우 링크를 클릭해도 앱이 확이되지 않는다.
DEFAULT
카테고리도 포함한다. 그렇지 않을 경우 앱이 암시적 인텐트에 응답할 수 없다. 이 카테고리가 있어야 인텐트에서 앱 구성요소 (Activity) 이름을 지정하지 않아도 활동을 시작할 수 있다.
아래는 "example://gizmos"
와 "http://www.example.com/gizmos"
URI 모두 딥 링크로 Activity를 시작할 수 있는 인텐트 필터 설정이다.
<activity
android:name="com.example.android.GizmosActivity"
android:label="@string/title_gizmos" >
<intent-filter android:label="@string/filter_view_http_gizmos">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
<data android:scheme="http"
android:host="www.example.com"
android:pathPrefix="/gizmos" />
<!-- note that the leading "/" is required for pathPrefix-->
</intent-filter>
<intent-filter android:label="@string/filter_view_example_gizmos">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "example://gizmos” -->
<data android:scheme="example"
android:host="gizmos" />
</intent-filter>
</activity>
레퍼런스)
https://developer.android.com/training/app-links/deep-linking?hl=ko
https://millo-l.github.io/URI%EC%99%80-URL%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90/
https://www.charlezz.com/?p=44767
https://www.ibm.com/docs/en/cics-ts/5.2?topic=concepts-components-url