アプリリンクは、HTTP または HTTPS スキームを使用するディープリンクで、Android によってウェブサイトに関連付けられていることが検証されます。アプリリンクを処理するための登録手順は次のとおりです。
- ウェブサイトのドメインまたは URL を指定するインテント フィルタを 1 つ以上アプリ マニフェストに追加します。
- インテント フィルタ要素に
autoVerify="true"attributeを追加します。これにより、スキームとホスト ドメインをウェブサイトのassetlinks.json構成と照合して検証する必要があるというシグナルがシステムに送られます。 - ウェブサイトの関連付けを宣言します。
スキームとホスト、および
autoVerify="true" を使用したアプリリンクの宣言の例を次に示します。
<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: アプリ
リンクには
android:autoVerify="true"属性が必要です。これにより、アプリと タグで指定されたスキームとドメインの関連付けを検証する必要があるというシグナルがシステムに送られます。<data>検証可能にするインテント フィルタごとにautoVerify="true" を追加することをおすすめします。 - データ要素: 各アプリリンク インテント フィルタには、検証可能なウェブサイト ドメインに一致するスキームとホスト形式を指定する
<data>要素が 1 つ以上含まれている必要があります。 - スキーム: インテント フィルタには、
<data>スキームとhttpスキームの両方のhttps要素を含める必要があります。 ホスト: 必要に応じて、1 つ以上の ホストに一致する
<data>要素を追加できます。ワイルドカード(*)を使用して、複数のサブドメイン(*.example.comなど)に一致させます。システムは、ウェブサイトの assetlinks.json ファイルと照合して各ホストを検証します。パスレベルのルーティングは、assetlinks.json ファイルで処理する必要があります(下記のベスト プラクティス セクションをご覧ください)。複数のホスト: 複数のホスト ドメインを宣言すると、システム( Android 12 以降)は各ドメインの検証を試みます。ホストが検証されると、アプリはその検証済みホストからのリンクのデフォルト ハンドラになります。Android 11 以前では、1 つでもホストを検証できないと検証に失敗します。
複数のインテント フィルタ: 一意の URL(スキームとホストの特定の組み合わせなど)を宣言する場合は、それぞれ個別のフィルタを作成する必要があります。1 つのインテント フィルタ内に複数の
<data>要素があると、実際にはマージされ、あらゆる組み合わせの属性バリエーションがすべてサポート対象になります。
マニフェスト フィルタ ルールに関する考慮事項
Android 15 以降で動的アプリリンクで使用するフィルタを設定する場合は、サーバーサイドの assetlinks.json ファイルで宣言された動的ルールによって、アプリ マニフェストで静的に宣言した URL ルールのスコープを拡張できないことに注意してください。
そのため、次の方法を使用することをおすすめします。
- アプリ マニフェストで、スキームとドメインのみを宣言するなど、可能な限り広範なスコープを設定します。
- パスレベルのルーティングなど、詳細な絞り込みにはサーバーサイドの assetlinks.json ルールを使用します。
この理想的な構成により、アプリ マニフェストで設定した広範なスコープ内に収まることを前提として、必要に応じて assetlinks.json ファイルに新しいアプリリンク パスを動的に追加できます。
複数のホストのアプリリンクをサポートする
システムは、アプリの URL インテント フィルタのデータ要素で指定されたホストを、そのインテント フィルタ内のそれぞれのウェブドメインでホストされている Digital Asset Links ファイルと照合して検証できる必要があります。検証に失敗した場合、システムは、インテント解決用の標準動作をデフォルト動作に設定します。デフォルト動作については、アプリ コンテンツ用のディープリンクを作成するをご覧ください。ただし、アプリの他のインテント フィルタで定義されている URL パターンのデフォルト ハンドラとして、アプリを検証することはできます。
ホストで条件に合致する Digital Asset Links ファイルが見つからない限り、アプリはデフォルト ハンドラとして検証されません。たとえば、次のインテント フィルタを持つアプリの場合、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` を呼び出した結果を含むカスタム チューザ ダイアログを表示します
queryIntentActivities。ユーザーは、ダイアログに表示された一致するアプリのリストから好みのアプリを選択できます。
Android 14 以前の動的アプリリンクの下位互換性
assetlinks.json の高度な照合ルールや <uri-relative-filter-group> の使用など、動的アプリリンクの機能は、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 以前では、このインテント フィルタは受信リンクに一致しません。また、assetlinks.json ルールの高度な照合ルールに基づいて、Android 15 以降で動的アプリリンクを使用するためにドメインを検証できます。
既存のアプリリンクの移行
マニフェストに特定のパスルール(
android:pathPrefixなど)を持つアプリリンクがすでに存在し、Android 15 以降で動的アプリリンク
の使用を開始する場合は、既存のインテント フィルタに <uri-relative-filter-group>
要素を直接追加しても安全です。
Android 14 以前では <uri-relative-filter-group> 要素が無視されるため、
既存のアプリリンクは、下位バージョンの Android を搭載したデバイスでこれまでどおり機能します。
ただし、Android 15 以降で「混合」構成がどのように評価されるかを慎重に検討する必要があります。
- 2 層フィルタリング: Android 15 以降では、インテント フィルタは結合として評価されます。URL は、従来の静的な
<data>タグまたは<uri-relative-filter-group>の広範なルールのいずれかを満たしていれば、マニフェスト チェックに合格します。URL がこの最初のマニフェスト チェックに合格すると、assetlinks.jsonファイルで定義された動的ルールが、2 層目の詳細なフィルタリングとして適用されます。つまり、サーバーサイドの JSON ルールによって、一致した URL のうち実際にアプリを開くものが最終的に決定されます。
ハイブリッド構成の例:
<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>