[Android] 딥 링크로 앱 콘텐츠 연결하기 1

문승연·2023년 8월 3일
0

Android 기초

목록 보기
2/8
post-thumbnail

안드로이드 기기 사용자는 앱에서 링크를 클릭해서 다른 앱이나 웹 페이지로 이동할 수 있다.

대표적인 예시로 웹 페이지에서 어떤 상품의 구매 버튼을 누르면 쿠팡 등 연관된 쇼핑몰 앱으로 이동한다던지 하는 상황을 스마트폰을 사용하다보면 어렵지 않게 겪을 수 있다.

이러한 경우 단순히 앱을 실행만 되는 게 아니라 앱의 특정 페이지로 정확히 사용자를 이동시켜주는 것을 알 수 있는데 이는 해당 링크가 앱의 특정 콘텐츠로 연결해주는 딥 링크이기 때문이다.

안드로이드 개발자는 매니페스트 에서 웹사이트 URI의 인텐트 필터를 만들고 인텐트에서 얻은 데이터를 사용할 앱을 구성함으로써 사용자가 앱의 특정 콘텐츠로 안내할 수 있도록 구현할 수 있다.

URI, URL, Scheme, Host

안드로이드 딥 링크에 대해 알아보기 전 URI와 URL의 차이. 그리고 URL의 구성요소들에 대해 간단히 짚어보자.

URI & URL

URI는 특정 리소스를 식별하는 통합 자원 식별자(Uniform Resource Identifier)를 의미한다. 웹에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스이다.

URL웹 주소라고도 부르며, 컴퓨터 네트워크 상에서 리소스가 어디 있는지 알려주기 위한 규약이다. URI의 서브셋이다.

얼핏 보면 비슷한 의미로 보이지만 둘의 가장 큰 차이점은 URI는 식별하고 URL은 위치를 가리킨다는 것이다.

사람으로 비유를 해보자면 URI는 사람을 특정할 수 있는 주민등록번호 같은 개념이며 URL은 해당 사람의 위치 즉, 주소를 나타내는 정보이다.

URL의 구성 요소

HTTP 또는 HTTPS 상에서 URL은 주로 아래와 같은 4가지 요소로 구성되어 있다.

  1. Scheme. 스키마는 인터넷 상에서 리소스에 접근하기 위한 프로토콜 식별자이다. 웹 상에서는 주로 HTTPHTTPS 가 많이 사용된다. 하지만 Android 딥 링크에서는 HTTPHTTPS 가 아닌 고유 식별자를 사용할 수도 있다.
  2. Host. 호스트는 해당 리소스의 주인을 식별할 수 있는 식별자이다. https://www.example.com 라는 URL에서 www.example.com이 호스트 값이 된다. 웹 상에서 호스트 는 해당 웹사이트의 IP 주소로 맵핑되지만 1대1 연결 관계는 아니다. (하나의 IP 주소가 여러 호스트에 맵핑될 수 있다.)
  3. Path. 패스호스트 내부에서 리소스에 접근하기 위한 세부적인 위치를 알려준다.
  4. Query String. 쿼리 스트링패스 뒤에 따라오며 패스 가 접근하고자 하는 리소스에 대해서 활용할 수 있는 문자열 정보를 제공한다. (ex. 찾고자 하는 리소스에 조건을 걸어 탐색하거나 정렬 조건을 제공할 수 있다.)

Android 딥 링크 구현하기

Android URI 처리 과정

링크를 클릭하거나 프로그램이 웹 URI 인텐트를 호출하면 Android 시스템에서 성공할 때까지 아래 요청을 순서대로 시도한다.

  1. URI를 처리할 수 있는, 사용자가 선호하는 앱(지정되어 있는 경우)을 연다.
  2. URI를 처리할 수 있는, 사용 가능한 유일한 앱을 연다.
  3. 사용자가 대화상자에서 앱을 선택하도록 한다.

인텐트 필터 추가하기

딥 링크를 만들려면 아래의 요소와 속성값이 포함된 인텐트 필터매니페스트에 추가해야한다.

  • <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

profile
"비몽(Bemong)"이라는 앱을 개발 및 운영 중인 안드로이드 개발자입니다.

0개의 댓글