IT_Programming/Android_Java

Android Deep Link 구현하기

JJun ™ 2015. 5. 31. 21:24

 


 출처: https://developers.google.com/app-indexing/webmasters/app?hl=ko


 

 

사용자가 Google 검색결과에서 앱으로 들어올수 있는 방법을 구현하는것

 

<activity android:name="com.example.android.GizmosActivity"
           android:label="@string/title_gizmos" >
     <intent-filter android:label="@string/filter_title_viewgizmos">
         <action android:name="android.intent.action.VIEW" />
         <!-- Accepts URIs that begin with "http://example.com/gizmos” -->
         <data android:scheme="http"
               android:host="example.com"
               android:pathPrefix="/gizmos" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
 </activity>


참고

https://developers.google.com/app-indexing/webmasters/app?hl=ko

 

 

 


 

 

앱에 딥 링크 추가

Google이 앱의 콘텐츠를 색인 생성하려면 (그리고 사용자가 Google 검색결과에서 앱으로 들어오려면)
앱 안에 있는 특정 콘텐츠에 접근하는 방법을 정의하는 앱 매니페스트에
인텐트 필터를 지정해야 합니다.

앱 콘텐츠에 딥 링크를 지정하는 방법은 다음과 같습니다.

  1. Google 검색결과에서 실행 가능한 액티비티에 대하여 한 개 이상의 <intent-filter> 요소를 Android 매니페스트 파일에서 추가합니다.
  2. ACTION_VIEW 인텐트 액션을 지정하는 <action> 태그를 추가합니다.
  3. 액티비티가 허용하는 각 데이터 URI 형식에 <data> 태그를 추가합니다. 이는 딥 링크에 대한 형식을 지정하는 기본 메커니즘입니다.
  4. BROWSABLEDEFAULT 인텐트 카테고리 모두에 <category>를 추가합니다.
    • BROWSABLE은 인텐트를 웹 브라우저에서 실행하기 위해 필요합니다. 이 카테고리가 없으면 브라우저에서 링크를 클릭하여도 앱으로 이동할 수 없으며 현재의 웹 브라우저만 URL에 응답합니다.
    • DEFAULT는 Google 검색결과에서 앱에 딥 링크를 제공하는 데에만 관심이 있는 경우에는 필요하지 않습니다. 하지만 사용자가 내 웹사이트를 가리키는 다른 모든 웹페이지에서 링크를 클릭했을 때 내 Android 앱이 응답하기를 바라는 경우에는 DEFAULT 카테고리가 필요합니다. Google 검색결과에서 사용되는 인텐트는 내 앱의 ID를 포함하므로 인텐트가 명시적으로 내 앱을 수신자로 가리키는 반면 내 사이트로 연결되는 다른 링크는 앱 ID를 모르므로 DEFAULT 카테고리가 암시적 인텐트를 수락함을 알린다는 점에서 차이가 납니다.

 

예를 들어 다음 액티비티는 사용자가 그 외 관심 분야에 대한 정보를 보기 위하여 인텐트를 사용하여 앱에 들어오도록 허용합니다.
인텐트 필터는 액티비티에서 다음과 같이 시작하는 URI가 포함된
VIEW 액션 인텐트에 응답하도록 선언합니다.

http://example.com/gizmos:

<activity android:name="com.example.android.GizmosActivity"
           android:label="@string/title_gizmos" >
     <intent-filter android:label="@string/filter_title_viewgizmos">
         <action android:name="android.intent.action.VIEW" />
         <!-- Accepts URIs that begin with "http://example.com/gizmos” -->
         <data android:scheme="http"
               android:host="example.com"
               android:pathPrefix="/gizmos" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.BROWSABLE" />
     </intent-filter>
 </activity>
 

이 예에서는 앱이 다음과 같은 딥 링크에 응답합니다.
http://example.com/gizmos?1234, http://example.com/gizmos/1234, http://example.com/gizmos/toys/1234

인텐트 필터의 <data> 요소는 최소한 android:scheme 속성을 제공해야 합니다. 그런 다음 속성을 더 추가하여 액티비티에서 수락하는 URI 유형을 더 세분화할 수 있습니다. 예를 들어 비슷한 URI를 수락하는 여러 액티비티를 가지고 있지만 액티비티에서 단지 경로명을 기반으로 해야만 구분할 수 있는 경우에는 path, pathPattern, pathPrefix 속성을 추가하여 시스템이 다른 URI 경로를 열어야 하는 액티비티를 구분할 수 있습니다.

 

 

위 예는 사용자가 그러한 링크를 클릭했을 때 웹페이지 대신 내가 만든 앱을 열 수 있도록 하는 웹페이지 URL과 일치하도록 의도된 URI 형식을 보여줍니다.
Android URI에 대한 단순화된 형식을 원하면 example://gizmos와 같은 대체 데이터 URI 형식을 만들 수 있습니다.
예를 들어 다음은 위에서 http://example.com/gizmos와 example://gizmos 두 유형 모두를 지원하는 동일한 인텐트 필터입니다.

 

<activity
     android:name="com.example.android.GizmosActivity"
     android:label="@string/title_gizmos" >
     <intent-filter android:label="@string/filter_title_viewgizmos">
         <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>
     <intent-filter android:label="@string/filter_title_viewgizmos">
         <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://example.com/gizmos” -->
         <data android:scheme="http"
               android:host="example.com"
               android:pathPrefix="/gizmos" />
     </intent-filter>
</activity>

 

이렇게 하면 앱이 example://gizmos?1234, example://gizmos/1234, example://gizmos/toys/1234 등과 같은 딥 링크뿐 아니라
위 예와 동일한
http://example.com/gizmos URL에도 응답합니다.

 

인텐트 필터가 내 AndroidManifest.xml에 추가되면 앱은 내 액티비티로 전달되는 데이터를 처리해야 합니다.

자세한 내용은 앱 콘텐츠에 대해 딥 링크 사용 설정에서 확인하세요.

 

 

 

딥 링크 테스트

Android Debug Bridge를 사용하여 딥 링크를 테스트할 수 있습니다.:

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

 

앱을 새로 설치한 상태에서 테스트하시기 바랍니다.

Google의 딥 링크 테스트 도구를 사용하여 휴대전화에서 딥 링크로 앱 동작을 테스트하세요.
또는
intent:// 링크가 있는 HTML페이지를 만들어 브라우저에서 앱의 동작을 테스트할 수도 있습니다.:

 
<a href="intent://example.com/gizmos#Intent;scheme=http;package=com.example.android;end;">
  http://example.com/gizmos</a>
<a href="intent://gizmos#Intent;scheme=example;package=com.example.android;end;">example://gizmos</a>

 

intent:// URL 사용에 대해 자세히 알아보려면 여기를 방문하세요.

 

앱 콘텐츠의 다른 부분에 대한 액세스 차단

Google에서 앱의 일부에 대한 색인만 생성하도록 허용하고 싶을 때가 있습니다. Android 앱에 noindex.xml 파일을 포함하여
색인 생성되어서는 안 되는 딥 링크를 지정함으로써 이를 Google에 알릴 수 있습니다.
제외할 URI 목록이나 URI 접두사의 목록을 지정할 수 있습니다.

이는 웹사이트에 대한 robots noindex 메타태그 작동 방식과 비슷합니다.

먼저 앱의 XML 리소스 디렉토리에서 새로운 XML 파일, res/xml/noindex.xml을 생성하세요.

 

파일은 다음과 같이 표시됩니다.

<?xml version="1.0" encoding="utf-8"?>
<search-engine xmlns:android="http://schemas.android.com/apk/res/android">
  <noindex uri="http://example.com/gizmos/hidden_uri"/>
  <noindex uriPrefix="http://example.com/gizmos/hidden_prefix"/>
  <noindex uri="gizmos://hidden_path"/>
  <noindex uriPrefix="gizmos://hidden_prefix"/>
</search-engine>

uri 속성과 정확하게 일치하는 딥 링크나 uriPrefix 속성과 일치하는 문자열로 시작하는 딥 링크는 색인 생성이 되지 않습니다.

noindex.xml 파일이 추가된 후에는 앱의 AndroidManifest.xml 파일의 application 섹션에서 참조되어야 합니다. 예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.Gizmos">
  <application>
    <activity android:name="com.example.android.GizmosActivity"
        android:label="@string/title_gizmos" >
      <intent-filter android:label="@string/filter_title_viewgizmos">
      <action android:name="android.intent.action.VIEW"/>
      ...
    </activity>
    <meta-data android:name="search-engine" android:resource="@xml/noindex"/>
  </application>
  <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

<meta-data android:name="search-engine" android:resource="@xml/noindex"/>noindex.xml 파일이 앱에서 발견될 수 있는 위치를 지정합니다.

지속적으로 앱의 색인을 생성하려면 Google Play 스토어에 게시된 모든 버전의 앱에 동일한 noindex.xml 파일을 포함해야 합니다.

다음으로 웹사이트에 앱을 연결하여 Google이 내 앱이 내 웹사이트의 공식 앱임을 알 수 있도록 해야 합니다.