안드로이드 딥 링크 설정 - andeuloideu dib lingkeu seoljeong

딥링크는 웹의 주소와도 같다

특정 주소 혹은 값을 입력하면 앱이 실행되거나 앱 내 특정 화면으로 이동시키는 기능을 수행하는 게 딥링크다

딥링크는 크게 세 가지로 구분된다

    1) URI 스키마 방식 : 앱에 호스트 및 스키마를 등록하여 딥링크 사용

    2) 앱 링크(App Link) : 도메인 주소를 이용한 딥링크 사용 - Android

    3) 유니버셜 링크 (Universal Link) 도메인 주소를 이용한 딥링크 사용 - iOS

오늘은 URI 스키마 방식을 얘기해보겠다

URI 스키마 방식은 가장 일반적으로 사용되는 딥링크다

구성은 Scheme://host 으로 구성되어있다

여기서 Scheme는 앱을 지칭하고 host는 앱 페이지를 지칭한다

설정은 AndroidManifest에서 가능하다

<activity android:name=".MainActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
	<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="openapp" android:scheme="myapp" />
	</intent-filter>
</activity>

이런 방식으로 구성을 하면 myApp://openapp으로 열면 설정한 Acitivity가 열리게 된다.

다른 Activity를 열고 싶다면 원하는 Activity에 설정을 해두면 된다

만약 딥링크로 어플을 열면서도 데이터를 보내고 싶으면 어떻게 해야 할까?

그것도 뒤에 파라미터만 추가하면 간단하게 보낼 수 있다

위를 예로 들어보자면

myapp://openapp?name=hanix_x 

가 되는 셈이다

앱 콘텐츠 딥 링크 만들기

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

클릭된 링크나 프로그램의 요청이 웹 URI 인텐트를 호출하면 Android 시스템에서는 요청이 성공할 때까지 다음 각 작업을 순서대로 시도합니다.

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

아래 단계에 따라 콘텐츠 링크를 만들고 테스트합니다. Android 스튜디오의 App Links Assistant를 사용하여 Android 앱 링크를 추가할 수도 있습니다.

수신 링크의 인텐트 필터 추가하기

앱 콘텐츠 링크를 만들려면 이러한 요소와 속성값이 포함된 인텐트 필터를 매니페스트에 추가합니다.

<action>Google 검색에서 인텐트 필터에 도달할 수 있도록 ACTION_VIEW 인텐트 작업을 지정합니다.<data>하나 이상의 <data> 태그를 추가합니다. 각 태그는 활동으로 확인되는 URI 형식을 나타냅니다. 최소한 <data> 태그에는 android:scheme 속성이 포함되어야 합니다.

속성을 추가하여 활동이 수락하는 URI 유형을 더욱 세분화할 수 있습니다. 예를 들어, 유사한 URI를 수락하지만, 경로 이름에 따라 달라지는 여러 활동이 있을 수 있습니다. 이 경우 android:path 속성 또는 속성의 pathPattern이나 pathPrefix 변형을 사용하여 시스템이 다양한 URI 경로에 대해 열어야 하는 활동을 구분할 수 있습니다.

<category>BROWSABLE 카테고리를 포함합니다. 이 속성은 웹브라우저에서 인텐트 필터에 액세스할 수 있으려면 필요합니다. 이 카테고리가 없는 경우 브라우저에서 링크를 클릭해도 앱으로 확인되지 않습니다.

DEFAULT 카테고리도 포함합니다. 그러면 앱이 암시적 인텐트에 응답할 수 있습니다. 이 카테고리가 없으면 인텐트에서 앱 구성요소 이름을 지정한 경우에만 활동을 시작할 수 있습니다.

다음 XML 스니펫은 매니페스트에서 딥 링크용 인텐트 필터를 지정할 수 있는 방법을 보여줍니다. “example://gizmos”“http://www.example.com/gizmos” URI 모두 이 활동으로 확인됩니다.

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

두 인텐트 필터는 <data> 요소만 다릅니다. 동일한 필터에 여러 <data> 요소를 포함할 수 있지만, 고유한 URL(예: schemehost의 특정 조합)을 선언하려는 경우 별도의 필터를 만드는 것이 중요합니다. 왜냐하면, 동일한 인텐트 필터의 여러 <data> 요소는 결합한 속성의 모든 변형을 고려하여 실제로 병합되기 때문입니다. 예를 들어, 다음 사항을 고려해 보세요.

    <intent-filter>
      ...
      <data android:scheme="https" android:host="www.example.com" />
      <data android:scheme="app" android:host="open.my.app" />
    </intent-filter>
    

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

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

인텐트 필터 정의와 관련하여 자세히 알아보려면 다른 앱에서 내 앱의 활동을 시작하도록 허용하기를 참고하세요.

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

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

다음은 Intent에서 데이터를 가져오는 방법을 보여주는 스니펫입니다.

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

        val action: String? = intent?.action
        val data: Uri? = intent?.data
    }
    

자바

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Intent intent = getIntent();
        String action = intent.getAction();
        Uri data = intent.getData();
    }
    

사용자의 경험을 향상하려면 다음 권장사항을 따르세요.

  • 딥 링크는 요청 메시지, 전면 페이지, 로그인 없이 곧바로 사용자를 콘텐츠에 연결해야 합니다. 사용자가 이전에 애플리케이션을 연 적이 없더라도 앱 콘텐츠를 볼 수 있도록 만드세요. 후속 상호작용 또는 런처에서 앱을 열 때 사용자에게 메시지를 표시해도 괜찮습니다.
  • '뒤로' 및 '위로' 기능으로 이동하기에서 설명하는 설계 안내에 따라 사용자가 딥 링크를 통해 앱에 진입한 후 앱이 사용자의 역방향 이동 기대에 부합하도록 만듭니다.

딥 링크 테스트하기

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

adb를 사용해 인텐트 필터 URI를 테스트하는 일반적인 구문은 다음과 같습니다.

    $ adb shell am start
            -W -a android.intent.action.VIEW
            -d <URI> <PACKAGE>
    

예를 들어, 아래의 명령어는 지정된 URI와 연결된 타겟 앱 활동을 봅니다.

    $ adb shell am start
            -W -a android.intent.action.VIEW
            -d "example://gizmos" com.example.android
    

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

인텐트와 앱 링크를 자세히 알아보려면 다음 리소스를 참고하세요.

  • 인텐트 및 인텐트 필터
  • 다른 앱에서 내 앱의 활동을 시작하도록 허용하기
  • Android 스튜디오에서 Android 앱 링크 추가하기

Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Last updated 2022-10-05 UTC.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"필요한 정보가 없음" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"너무 복잡함/단계 수가 너무 많음" },{ "type": "thumb-down", "id": "outOfDate", "label":"오래됨" },{ "type": "thumb-down", "id": "translationIssue", "label":"번역 문제" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"샘플/코드 문제" },{ "type": "thumb-down", "id": "otherDown", "label":"기타" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"이해하기 쉬움" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"문제가 해결됨" },{ "type": "thumb-up", "id": "otherUp", "label":"기타" }]