アプリリンクは、HTTP または HTTPS スキームを使用するディープリンクであり、ウェブサイトに関連付けられていることが Android によって検証されています。アプリリンクを処理するように登録する手順は次のとおりです。
- ウェブサイトのドメインまたは URL を指定する 1 つ以上のインテント フィルタをアプリ マニフェストに追加します。
autoVerify="true"attributeをインテント フィルタ要素に追加します。これにより、ウェブサイトのassetlinks.json構成に対してスキームとホストドメインの検証を試みるようシステムに指示します。- ウェブサイトの関連付けを宣言します。
スキームとホスト、autoVerify="true を含む App Link 宣言の例を次に示します。
<activity
android:name=".MainActivity"
android:exported="true"
...>
<!-- Make sure you explicitly set android:autoVerify to "true". -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- If a user clicks on a link that uses the "http" scheme, your
app should be able to delegate that traffic to "https". -->
<!-- Do not include other schemes, as this will prevent verification. -->
<data android:scheme="http" />
<data android:scheme="https" />
<!-- Include one or more domains that should be verified. -->
<data android:host="www.example.com" />
<data android:host="*.example.com" />
</intent-filter>
</activity>
コードに関する主なポイント
- AutoVerify: App Links には
android:autoVerify="true"属性が必要です。これにより、アプリと<data>タグで指定されたスキームおよびドメインの関連付けを検証するようシステムに指示します。検証可能にするすべてのインテント フィルタにautoVerify="true" を追加することをおすすめします。 - データ要素: 各 App Links インテント フィルタには、検証可能なウェブサイト ドメインに一致するスキームとホスト形式を指定する 1 つ以上の
<data>要素を含める必要があります。 - スキーム: インテント フィルタには、
httpスキームとhttpsスキームの両方の<data>要素を含める必要があります。 ホスト: 必要に応じて、1 つ以上のホストに一致する
<data>要素を追加できます。ワイルドカード(*)を使用して、複数のサブドメイン(*.example.comなど)を一致させます。システムは、ウェブサイトの assetlinks.json ファイルに対して各ホストの検証を試みます。パスレベルのルーティングは、assetlinks.json ファイルで処理する必要があります(下記のベスト プラクティスのセクションをご覧ください)。複数のホスト: 複数のホストドメインを宣言すると、システム(Android 12 以降)はそれぞれを検証しようとします。検証済みのホストがある場合、アプリはその検証済みホストからのリンクのデフォルト ハンドラになります。Android 11 以前では、1 つのホストでも検証できない場合、検証は失敗します。
複数のインテント フィルタ: 固有の URL(スキームとホストの特定の組み合わせなど)を宣言する場合は、個別のフィルタを作成することが重要です。同じインテント フィルタ内の複数の
<data>要素は、結合された属性のすべてのバリエーションを考慮してマージされるためです。
マニフェスト フィルタ ルールに関する考慮事項
Android 15 以降で動的アプリリンクを使用するためにフィルタを設定する場合は、サーバーサイドの assetlinks.json ファイルで宣言された動的ルールでは、アプリ マニフェストで静的に宣言した URL ルールのスコープを拡張できないことに注意してください。
このため、次の方法を使用することをおすすめします。
- アプリ マニフェストで、スキームとドメインのみを宣言するなどして、可能な限り広いスコープを設定します。
- パスレベルのルーティングなど、さらに詳細な設定を行うには、サーバーサイドの assetlinks.json ルールを使用します。
この理想的な構成では、必要に応じて assetlinks.json ファイルに新しい App Links パスを動的に追加できます。これらのパスは、アプリ マニフェストで設定した広範なスコープに収まります。
複数のホストの App Links をサポートする
システムは、アプリの URL インテント フィルタのデータ要素で指定されたホストを、そのインテント フィルタのそれぞれのウェブドメインでホストされているデジタル アセット リンク ファイルと照合して検証できなければなりません。検証が失敗した場合、システムはデフォルトの標準動作でインテントを解決します。詳しくは、アプリ コンテンツ用のディープリンクを作成するをご覧ください。ただし、アプリの他のインテント フィルタで定義されている URL パターンのデフォルト ハンドラとして検証されることはあります。
たとえば、次のインテント フィルタを持つアプリは、assetlinks.json ファイルが https://www.example.com/.well-known/assetlinks.json で見つかり、https://www.example.net/.well-known/assetlinks.json で見つからない場合、https://www.example.com の検証のみに合格します。
<application>
<activity android:name="MainActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="www.example.com" />
</intent-filter>
</activity>
<activity android:name="SecondActivity">
<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:scheme="https" />
<data android:host="www.example.net" />
</intent-filter>
</activity>
</application>
複数のサブドメインのアプリリンクをサポートする
Digital Asset Links プロトコルは、インテント フィルタ内のサブドメインを、一意の個別のホストとして扱います。したがって、インテント フィルタに異なるサブドメインを持つ複数のホストがリストされている場合は、各ドメインで有効な assetlinks.json を公開する必要があります。たとえば、次のインテント フィルタには、受け入れられるインテント URL ホストとして www.example.com と mobile.example.com が含まれています。そのため、有効な assetlinks.json を https://www.example.com/.well-known/assetlinks.json と https://mobile.example.com/.well-known/assetlinks.json の両方で公開する必要があります。
<application>
<activity android:name="MainActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:scheme="https" />
<data android:host="www.example.com" />
<data android:host="mobile.example.com" />
</intent-filter>
</activity>
</application>
または、ワイルドカード(*.example.com など)を使用してホスト名を宣言する場合は、ルートホスト名(example.com)で assetlinks.json ファイルを公開する必要があります。たとえば、次のインテント フィルタを持つアプリは、assetlinks.json ファイルが https://example.com/.well-known/assetlinks.json で公開されている限り、example.com の任意のサブ名(foo.example.com など)の検証に合格します。
<application>
<activity android:name="MainActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="*.example.com" />
</intent-filter>
</activity>
</application>
同じドメインに関連付けられている複数のアプリを確認する
同じドメインに関連付けられている複数のアプリを公開する場合、各アプリを正常に検証できます。ただし、軽量版とフル版のようにアプリがまったく同じドメインホストとパスを解決できる場合は、直近にインストールされたアプリのみがそのドメインのウェブ インテントを解決できます。
このような場合は、必要なパッケージの公開設定があることを前提として、ユーザーのデバイスで競合する可能性のあるアプリを確認します。次に、アプリで、queryIntentActivities の呼び出し結果を含むカスタム選択ツール ダイアログを表示します。ユーザーは、ダイアログに表示される一致するアプリのリストから、希望するアプリを選択できます。
Android 14 以前の動的アプリリンクの下位互換性
assetlinks.json の高度なマッチング ルールや <uri-relative-filter-group> の使用など、Dynamic App Link の機能は、Android 15(API レベル 35)以降でのみ完全にサポートされています。
Android 14(API レベル 34)以前では、システムはアプリリンクの検証に、マニフェストの <data> 要素で宣言された scheme と host のみを考慮します。assetlinks.json のパス固有のルール、除外、動的更新は適用されません。
つまり、マニフェストで scheme と host のみを指定している場合、Android 15 以降の assetlinks.json で定義されているパス固有のルールに関係なく、Android 14 以前で検証済みドメインのすべてのパスが予期せずキャプチャされる可能性があります。
ディープリンクなしで構成される、下位の Android バージョン向けのフォールバック戦略
Android 15 以降でより具体的なパスに動的アプリリンクを使用する場合に、Android 14 以前でアプリがドメインのすべてのリンクを処理しないようにするには、マニフェストのインテント フィルタに一致しないパスを含めます。リンクの有効なパスになる可能性が低い android:path 属性を持つ <data> 要素を追加します。これにより、インテント フィルタが下位バージョンですべてのパスに一致しないようにします。
例:
<activity
android:name=".MainActivity"
android:exported="true"
...>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="www.example.com" />
<!-- Add a non-matching path for backward compatibility -->
<data android:path="/no_match_for_older_android_versions" />
<uri-relative-filter-group android:allow="true">
<data android:pathPattern="/.*"/>
</uri-relative-filter-group>
</intent-filter>
</activity>
<data android:path="/no_match_for_older_android_versions" /> を追加すると、Android 14 以前では、このインテント フィルタが受信リンクと一致しなくなります。一方、Android 15 以降では、assetlinks.json ルール内の高度な一致ルールに基づいて、Dynamic App Links で使用するドメインを検証できます。
既存のアプリリンクの移行
マニフェストに特定のパスルール(android:pathPrefix など)を持つアプリリンクがすでにあり、Android 15 以降で動的アプリリンクの使用を開始する場合は、既存のインテント フィルタに <uri-relative-filter-group> 要素を直接追加しても問題ありません。
Android 14 以前では <uri-relative-filter-group> 要素が無視されるため、既存の App Links は、以前のバージョンの Android を搭載したデバイスでも、これまでどおり機能します。
ただし、Android 15 以降で「混合」構成がどのように評価されるかを慎重に検討する必要があります。
- 2 層フィルタリング: Android 15 以降では、システムはインテント フィルタをユニオンとして評価します。URL が以前の静的
<data>タグまたは<uri-relative-filter-group>の広範なルールのいずれかを満たしている場合、マニフェスト チェックに合格します。URL がこの最初のマニフェスト チェックに合格すると、システムはassetlinks.jsonファイルで定義された動的ルールを、きめ細かいフィルタリングの第 2 層として適用します。つまり、一致した URL のうち、実際にアプリを開く URL は、最終的にサーバーサイドの JSON ルールによって決まります。
ハイブリッド構成の例:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="www.example.com" />
<!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
also use this. -->
<data android:pathPrefix="/store" />
<!--
Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
evaluate this as a union between all paths and the configuration
specified in the assetlinks.json file. Make sure to apply further
refinements in the assetlinks.json file to prevent all URL paths from
opening in the app.
-->
<uri-relative-filter-group android:allow="true">
<data android:pathPrefix="/" />
</uri-relative-filter-group>
</intent-filter>