なぜリンクがブラウザで開いてしまうのか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.comとwww.example.comは異なるドメインとして扱われ、両方の検証が必要です。## クイックフィックス: ADBによる手動検証システムの再試行を待つ必要はありません。Android Debug Bridge (ADB) を使用して、現在のステータスを確認し、OSがどのように認識しているかを正確に把握した上で、強制的に再検証を行うことができます。 ドメインのステータスを確認する:
adb shell pm get-app-links com.your.package.name
出力に legacy_failure、undefined、または 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.json は https://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-Type を application/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 に、リンクで使用されている別のドメインやサブドメインが不足していないか再確認してください。

