[Android] 딥링크

JINA·2021년 10월 21일
0

🔗딥 링크란?

  • 딥 링크는 홈페이지가 아닌 홈페이지 내의 특정 화면에 한 번에 도달할 수 있는 링크를 말한다. 링크는 모바일과 웹에서 모두 사용되는 개념이다. 예시를 들자면 https://velog.io/ 벨로그 자체 링크가 아닌 나의 벨로그(특정화면)으로 이동하기 위한 링크 https://velog.io/@dev_jin 를 말하는 것 이다. 마찬가지로, 모바일 앱 딥링킹은 사용자가 웹 페이지 또는 다른 앱에서 URL을 클릭하면 앱을 실행하고 특정 페이지를 여는 기술이다.

딥링크가 필요한 이유

sns에서 광고로 뜬 상품을 클릭하면 앱 스토어로 연결되어 앱을 깔아야만 상품을 볼 수 있도록 딥링크를 사용하거나, 또는 휴면 계정으로 전환된 회원들에게만 다시 앱을 사용하게끔 프로모션을 진행한다면 프로모션에 대한 검색이나 쿠폰 코드를 직접 입력할 필요없이 앱 내에서 한 번의 클릭으로 프로모션 페이지로 이동하도록 딥링크를 사용할 수 있을 것이다.

이렇듯 모바일 앱 딥링크는 사용자 경험을 원활하게 하여 사용자가 앱을 설치하거나 계속 사용하도록 하는 역할이다.

다양한 유형의 링크


Android 앱에서 만들 수 있는 다양한 유형의 링크(딥 링크, 웹 링크, Android 앱 링크)등 여러가지 방식이 있다. 위의 그림은 링크 간의 관계를 보여준다.

오늘은 딥 링크에 대해 알아볼 것이다. 딥링크는 사용자를 앱의 특정 부분으로 직접 연결하는 모든 체계의 URI이다. 딥링크를 생성하려면 Intent를 추가하여 사용자를 앱에서 특정 활동으로 유도한다.

앱 콘텐츠에 대한 딥 링크 생성

🧩앱 콘텐츠에 대한 딥 링크 생성 순서

1. 수신 링크에 대한 인텐트 필터 추가
2. 들어오는 인텐트에서 데이터 읽기
3. 딥 링크 테스트

1. 수신 링크에 대한 인텐트 필터 추가

앱 컨텐츠에 대한 링크를 만들려면 매니페스트에 다음 요소와 속성 값이 인텐트 필터를 추가한다.

  • <action>태그 안에 ACTION_VIEW로 구글에 검색했을 때 인텐트 필터에 도달할 수 있도록 인텐트 작업을 지정한다.

  • 하나 이상의 <data>태그를 추가한다. 각 태그는 활동으로 확인되는 URI형식을 나타낸다. <data>태그안에 최소한 android:scheme 속성이 포함되어야 한다. android:scheme 속성은 URI의 스키마 부분으로 URI를 지정하기 위한 최소한의 필수 속성이다. scheme속성을 설정하지 않으면 다른 URI 속성이 의미가 없다. 스키마는 뒤에 콜론을 쓰지 않고 지정한다. 예를 들어 http이다.(http: 아님) android:host 속성은 URI 권한의 호스트 부분이다. 이 속성도 scheme 속성이 지정되어 있지 않으면 의미가 없다. 속성을 추가하여 활동이 수락하는 URI 유형을 더욱 세분화할 수 있다. 예를 들어, 유사한 URI를 수락하지만, 경로 이름에 따라 달라지는 여러 활동이 있을 경우 android:path 속성 또는 속성의 pathPattern이나 pathPrefix 변형을 사용하여 시스템이 다양한 URI 경로에 대해 열어야 하는 활동을 구분할 수 있다. android:pathPrefix 속성은 URI에서 슬래시(/)로 시작해야하는 경로 부분이다. pathPrefix 속성은 인텐트 객체의 경로 중 일부분만 일치하는 일부 경로를 지정한다.

  • <category> 태그 안에 BROWSABLE속성은 웹브라우저에서 인텐트 필터에 접근하려면 필요하다. 이 카테고리가 없는 경우 브라우저에서 링크를 클릭해도 앱으로 확인되지 않는다. DEFAULT속성이 있어야 앱이 암시적 인텐트에 응답할 수 있다. 이 카테고리가 없는면 인텐트에서 앱 구성요소 이름을 지정한 경우에만 시작할 수 있다.

위의 코드에는 두개의 인텐트 필터가 있는데 차이점은 <data> 태그안의 요소이다. 물론 동일한 인텐트 필터 안에 여러 <data>요소를 포함할 수 있지만 고유한 URI(예시: schemehost의 특정 조합)을 선언하려는 경우 별도의 인텐트 필터를 만드는게 중요하다. 왜냐하면 동일한 인텐트 빌터의 여러 <data>요소는 결합한 속성의 모든 변형을 고려하여 실제로 병합되기 때문이다. 예를 들어 다음 코드를 봐보자.

https://www.example.comapp://open.my.app만 지원하는 것 같지만, 실제로는 이 두 가지 외에 app://www.example.comhttps://open.my.app도 지원한다.

위와 같이 활동 컨텐츠의 URI가 포함된 인텐트 필터를 앱 매니페스트에 추가하면 Android는 런타임 시 앱과 일치하는 URI가 있는 모든 Intent를 전달할 수 있다.

2. 수신되는 인텐트에서 데이터 읽기

시스템이 인텐트 필터를 통해 활동을 시작하면 Intent에서 제공하는 데이터를 사용하여 렌더링해야하는 대상을 결정할 수 있다. getData()getAction() 메서드를 호출하여 수신 Intent와 연결된 데이터와 작업을 가져온다. 액티비티의 생명주기 동안에는 이러한 메서드를 언제든 호출할 수 있지만, 일반적으로 onCreate()onStart()와 같은 초기 콜백에서 호출해야한다. 다음 코드는 Intent에서 데이터를 가져오는 방법을 보여준다.

앱에 대한 사용자의 경험을 향상시키려면 고려할 사항이 있다.

  • 딥링크는 요청메세지, 전면 페이지, 로그인 없이 사용자를 곧바로 컨텐츠에 연결해야한다. 그러므로 사용자가 이전에 어플리케이션을 실행한 적이 없더라도 앱 컨텐츠를 볼 수 있도록 만들어야한다.

  • 딥 링크를 통해 앱에 들어왔을 때 뒤로 가기 등의 이동 설계가 필요하다.

3. 딥 링크 테스트하기

Android 디버그 브리지를 활동 관리자(am) 도구와 함께 사용하여 딥 링크용으로 지정한 인텐트 필터 URI가 올바른 앱 활동으로 확인되는지 테스트 할 수 있다. 기기나 에뮬레이터에 관해 adb명령어를 실행할 수 있다.
adb를 사용해 인텐트 필터 URI를 테스트하는 일반적인 코드를 봐보자.

예를 들면 아래의 명령어는 지정된 URI와 연결된 타겟의 앱 액티비티를 본다.

1번에서 설정한 매니페스트 선언과 인텐트 핸들러는 앱과 웹사이트 간의 연결 및 수신 링크로 해야 할 작업을 정의한다. 그러나 시스템에서 앱이 URI집합의 기본 핸들러로 취급되도록 하려면 이 연결을 인증하도록 시스템에 요청해야한다.

참고자료1
참고자료2

0개의 댓글