Android App Linksの修正: 「Intent filter verification failed」エラーの解決策

intermediate📱 Android2026-07-19| Android 6.0 (API 23) 以上。Android 12 (API 31) 以降では必須。

Error Message

Intent filter verification failed for domain: example.com
#deeplink#app-links#intent-filter#android

なぜリンクがブラウザで開いてしまうのかAndroid App Linksを設定したにもかかわらず、アプリがシームレスに起動せず、システムに無視されることがあります。ユーザーがリンクをクリックするとモバイルブラウザが開いてしまう、まさに避けたい事態です。Logcatを確認すると、おそらく Intent filter verification failed for domain: example.com という特定のエラーが表示されているはずです。

Android 12でルールが変わりました。以前は検証に失敗してもユーザーに選択ダイアログが表示されていました。しかし現在、検証に失敗すると、システムは毎回デフォルトでブラウザを開きます。検証プロセスは、Androidがサーバーからファイルを取得してドメインの所有権を証明する、厳格なハンドシェイクです。

検証失敗の主な原因AndroidシステムのIntent Filter検証サービスは非常にデリケートです。以下の条件が一つでも満たされない場合、ハンドシェイクは失敗します。

  • HTTPSなし: assetlinks.json ファイルはセキュアな接続(HTTPS)でアクセス可能である必要があります。- 無効なステータスコード: サーバーは 200 OK を返す必要があります。リダイレクト(301または302)は失敗とみなされます。- 誤ったMIMEタイプ: Content-Type ヘッダーは application/json である必要があります。- フィンガープリントの不一致: JSON内のSHA-256フィンガープリントが、APKの署名に使用されたキーと一致していません。- サブドメインの問題: example.comwww.example.com は異なるドメインとして扱われ、両方の検証が必要です。## クイックフィックス: ADBによる手動検証システムの再試行を待つ必要はありません。Android Debug Bridge (ADB) を使用して、現在のステータスを確認し、OSがどのように認識しているかを正確に把握した上で、強制的に再検証を行うことができます。 ドメインのステータスを確認する:
adb shell pm get-app-links com.your.package.name

出力に legacy_failureundefined、または ask と表示されている場合、検証は失敗しています。Android 12以降のデバイスでシステムにハンドシェイクを再試行させるには、次を実行します。

adb shell pm verify-app-links --re-verify com.your.package.name

恒久的な修正手順### 1. AndroidManifest.xmlの確認インテントフィルタに android:autoVerify="true" が含まれていることを確認してください。この属性は、Androidに検証ファイルの取得を指示するトリガーとなります。これがないと、システムは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="example.com" />
</intent-filter>

2. assetlinks.jsonファイルの検証assetlinks.jsonhttps://yourdomain.com/.well-known/assetlinks.json に配置する必要があります。よくある落とし穴は、誤ったSHA-256フィンガープリントを使用することです。Google Play アプリ署名を使用している場合、ローカルのデバッグビルドのフィンガープリントは、Googleが管理するリリースビルドのものとは異なります。

keytoolを使用してローカルのSHA-256フィンガープリントを抽出します:

keytool -list -v -keystore my-release-key.keystore

ファイルは以下のようになります(末尾のカンマがないことを確認してください):

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.your.package.name",
      "sha256_cert_fingerprints": [
        "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
      ]
    }
  }
]

3. サーバー側の要件サーバー設定を確認してください。S3やGitHub Pagesなどの多くの静的ファイルホストでは、拡張子のないファイルに対してデフォルトで text/plain が設定されます。明示的に Content-Typeapplication/json に設定する必要があります。また、robots.txt が誤ってクローラーによる /.well-known/ パスへのアクセスをブロックしていないか確認してください。

修正が完了したことを確認する方法変更をデプロイしてアプリを再インストールした後、次のコマンドを実行して最終的な状態を確認します:

adb shell dumpsys package domain-preferred-apps

自分のパッケージ名を探します。status: always と表示されていれば成功です。これは、システムがドメインの検証に成功し、アプリがデフォルトのハンドラーになったことを意味します。 外部からの確認には、Google Digital Asset Links APIを使用します:

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls

APIが正しくパッケージ名を返しているのにアプリが動作しない場合は、AndroidManifest.xml に、リンクで使用されている別のドメインやサブドメインが不足していないか再確認してください。

Related Error Notes