ディープリンクを作成する

ディープリンクを使用すると、ウェブブラウザ、通知、ソーシャル メディア、広告などのソースからユーザーをアプリに直接誘導できます。ディープリンクは、アプリ間やウェブからアプリへの直接的な移行を可能にし、コンテキストに沿ったターゲット設定されたコンテンツを通じてエンゲージメントを高めるのに役立ちます。

このガイドでは、ディープリンクの仕組みと、コンテンツへのディープリンクを作成してテストする方法について説明します。

自社のウェブサイトやドメインを参照するディープリンクには、ユーザーにシームレスで信頼性の高いエクスペリエンスを提供するアプリリンクを使用することをおすすめします。

ディープリンクの仕組み

ディープリンクは Android の一般的なシステム機能であり、すべてのバージョン、すべてのデバイスでサポートされています。Android のインテント システムを利用して、ディープリンクを対象のアプリにルーティングします。特定のディープリンク URI を処理するアプリは、アプリ マニフェスト ファイルで一致するインテント フィルタを宣言します。

実行時にユーザーがリンクをタップすると、Android はインテントをトリガーし、アプリにルーティングしようとします。複数のアプリが特定の URI に一致するインテント フィルタを宣言できるため、Android は次のアクションをこの順序で実行してインテントをルーティングします。

  1. URI を処理できるデフォルトのアプリが指定されている場合は、そのアプリを開きます。
  2. URI を処理できるアプリが 1 つだけしかない場合は、そのアプリを開きます。
  3. ユーザーが曖昧さ回避のダイアログからアプリを選択できるようにします。

つまり、インテント フィルタが特定の URI と一致していても、システムがディープリンク インテントをアプリにルーティングする保証はありません。インテントを処理するアプリを管理するうえでユーザーは重要な役割を果たし、ユーザーが制御して選択できるようになっています。独自のウェブサイトやドメインへのディープリンクをより詳細に管理するには、アプリリンクの使用をお試しください。

Android の曖昧さ回避ダイアログでは、ディープリンク インテントを処理するために登録されたインストール済みアプリをすべて確認できます。ユーザーは、このタイプのリンクのデフォルトとしてアプリを選択することもできます。ユーザーがデフォルトを設定すると、システムはその特定のインテントのダイアログを表示しなくなり、選択したアプリが自動的に開きます。

図 1. 確認ダイアログ

曖昧さ回避ダイアログの動作は、Android のバージョンによって異なります。たとえば、Android 12 以降では、検証されていないアプリリンクのウェブリンクは通常、デフォルトでウェブブラウザで開きますが、以前のバージョンでは、アプリがウェブリンクを処理できる場合、ユーザーの確認ダイアログが表示されることがあります。

: Android 12(API レベル 31)以降、一般的なウェブ インテントは、そのウェブ インテントに含まれる特定のドメインについてアプリが承認されている場合のみ、アプリのアクティビティに解決されます。アプリがそのドメインに対して承認されていない場合、ウェブ インテントは代わりにユーザーのデフォルトのブラウザアプリに解決されます。

ディープリンクの種類

Android でサポートできるディープリンクには、次の 3 種類があります。

  • カスタム ディープリンク: カスタム URI スキーム(example://products/123 など)を使用して、ユーザーをアプリ内の特定のコンテンツに直接誘導するディープリンクです。内部ナビゲーションや、管理しているソースからのリンクには有効ですが、標準のウェブリンクではなく、別のアプリが同じカスタム スキームを登録している場合は、曖昧さ回避ダイアログがトリガーされる可能性があります。
  • ウェブリンク: 標準の http スキームと https スキームを使用するディープリンクです。標準 URL であるため汎用性が高いですが、Android 12 以降ではほぼ常に曖昧さ回避ダイアログがトリガーされるため、アプリにルーティングされるのではなく、デフォルトでユーザーのウェブブラウザで処理される可能性が高くなります。
  • アプリリンク: Android 6.0(API レベル 23)以降で利用可能な、検証済みウェブリンクです。ウェブサイトの関連付けプロセスを通じて、ドメインの所有権を Android システムに証明できます。検証が完了すると、そのドメインのリンクは自動的にアプリに直接ルーティングされ、確認ダイアログは完全にスキップされます。これにより、ユーザーは信頼できるシームレスなエクスペリエンスを利用できます。

受信リンク用のインテント フィルタを追加する

アプリ コンテンツ用のリンクを作成するには、次の要素と属性値を含むインテント フィルタをマニフェスト内に追加します。

<action>

Google 検索からインテント フィルタに到達できるように ACTION_VIEW インテント アクションを指定します。

<data>

1 つ以上の <data> タグを追加します。各タグは、アクティビティに解決される URI 形式を表します。<data> タグには、少なくとも android:scheme 属性が含まれている必要があります。

属性を追加することで、アクティビティが受け入れる URI タイプを絞り込むことができます。たとえば、ベースとなるパス名だけが異なる類似の URI をそれぞれ受け入れる複数のアクティビティがあるとします。このような場合、android:path 属性またはそのバリアント(pathPatternpathPrefix)を使用することで、各 URI パスに対してどのアクティビティを開くのかを指定できます。

<category>

BROWSABLE カテゴリを含めます。インテント フィルタにウェブブラウザからアクセスできるようにするために必要です。このカテゴリを指定しないと、ブラウザ内のリンクをアプリに変換できなくなります。

DEFAULT カテゴリも指定します。これにより、アプリが暗黙的インテントに応答できるようになります。このカテゴリを指定しなかった場合、インテントがアプリ コンポーネント名を指定していない限り、アクティビティを起動できなくなります。

マニフェスト内でディープリンク用のインテント フィルタを指定する方法を次の XML スニペットに示します。URI の "example://gizmos""http://www.example.com/gizmos" は、どちらもこのアクティビティに変換されます。

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

2 つのインテント フィルタの違いは <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 だけをサポートしているように見えるかもしれません。しかし、実際には、上記の 2 つに加えて app://www.example.comhttps://open.my.app もサポートしています。

注意: 複数のアクティビティに、同じ確認済みの Android アプリリンクに解決されるインテント フィルタが含まれている場合、どのリンクがアクティビティを処理するかは保証されません。

アクティビティ コンテンツ用の 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
}

Java

@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 Debug Bridge と Activity Manager(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

: ルートで **@Serializable data class Product(val colors: List)** などのプリミティブ型のコレクションを定義すると、自動生成されるディープリンク URL の形式は **basePath?colors={value**} になります。複数のクエリ パラメータを含む URI(**basepath?colors=red&colors=blue** など)を指定する場合は、アンパサンドをエスケープする必要があります(**basepath?colors=red\&colors=blue** など)。

設定したマニフェスト宣言とインテント ハンドラは、アプリとウェブサイトの間の接続と、受信リンクの処理内容について定義しています。ただし、システムがアプリを URI セットのデフォルト ハンドラとして扱うようにするには、この接続自体を検証するようにリクエストする必要があります。アプリリンクの検証では、この検証を実装する方法について説明します。

インテントやアプリリンクの詳細については、以下の参考リンクをご覧ください。