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

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

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

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

ディープリンクの仕組み

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

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

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

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

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

リンクのアプリ オプションを表示する Android システムの曖昧さ回避ダイアログ。
図 1. 曖昧性除去ダイアログ

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

ディープリンクの種類

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 属性またはその pathPattern または pathPrefix バリアントを使用して、異なる 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(scheme と host の特定の組み合わせなど)を宣言する場合は、別々のフィルタを作成することが重要です。同じインテント フィルタ内の複数の <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.com と app://open.my.app のみをサポートしているように見えるかもしれません。ただし、実際には、この 2 つに加えて app://www.example.com と https://open.my.app もサポートしています。

アクティビティ コンテンツの URI を含むインテント フィルタをアプリ マニフェストに追加すると、Android は、一致する URI を持つ Intent を実行時にアプリにルーティングできるようになります。

インテント フィルタの定義について詳しくは、他のアプリからの Activity の開始を許可するをご覧ください。

受信インテントからデータを読み取る

インテント フィルタを介してシステムがアクティビティを開始すると、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 とアクティビティ マネージャー(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

Android 17 以降では、am start で --debug-link フラグを使用して、システムが URL を解決する方法を診断し、一致するインテント フィルタまたは動的アプリリンク ルールを検査することもできます。詳細については、debug-link フラグを使用してリンク解決を診断するをご覧ください。

設定したマニフェスト宣言とインテント ハンドラは、アプリとウェブサイトの接続、および受信リンクの処理を定義します。ただし、一連の URI のデフォルト ハンドラとしてアプリをシステムに処理させるには、この接続を検証するようシステムにリクエストする必要もあります。アプリリンクを確認するでは、この確認を実装する方法について説明しています。

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