App LinkはAndroid(Android 6.0+)の仕組みで、インストールされたアプリでウェブリンクを自動的に開き、選択ダイアログをスキップします。この用語はGoogleが2015年にAndroid 6.0 Marshmallowとともに導入しました。Android Developersによると、App LinkはDigital Asset Linksを使用します。これはサーバー上のファイルによる暗号検証で、ドメインがアプリ開発者に属することを確認します。
重要なポイント
App Link(Android App Link)は標準的なHTTPSリンクで、Androidデバイスでクリックすると、ブラウザとアプリの間の標準的な選択ダイアログを表示せずに、インストールされたアプリを自動的に開きます。GoogleはAndroid 6.0(API 23)で、余分なクリックとユーザーの混乱によりdeep linkのコンバージョンを低下させていた“チューザーダイアログ”問題の解決策としてApp Linkを導入しました。
重要な革新点:検証。AndroidはDigital Asset Links APIを通じて、ドメインが実際にアプリ開発者に属することを検証します。Google Play Storeは公開時にApp Linkをチェックし、検証に失敗するとアップデートを拒否できます。これによりApp LinkはCustom URL Schemeよりも安全になります。他のアプリがあなたのドメインへのリンクを傍受することはできません。
Digital Asset Linksはオープンプロトコルで、GoogleはApp Linkだけでなく、検索結果、Google Assistant、Smart Lock for Passwordsでのウェブサイトとアプリの連携にも使用しています。このプロトコルは暗号検証に基づいています。assetlinks.jsonにはアプリの署名証明書のSHA256フィンガープリントが指定され、偽造を防ぎます。
App Linkの動作プロセスは3つの段階で構成されます:Digital Asset Linksの検証、Intent Filterによる処理、自動リダイレクト。各段階は必須です。検証に失敗した場合、Androidは選択ダイアログを表示します。このようなdeep linkは通常通り動作しますが、自動遷移の利点はありません。
Asset Linksはサーバーのhttps://domain/.well-known/assetlinks.jsonに配置されるJSONファイルです。ファイルにはフィールドを持つオブジェクトの配列が含まれます:relation(関係タイプを記述する文字列の配列)、target(アプリのnamespaceとpackage_name、およびsha256_cert_fingerprints — 署名証明書のSHA256フィンガープリントの配列を持つオブジェクト)。
// assetlinks.json — App Linkの最小構成
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:AD:A4:C5:AD:6B:01:14:79:6B:CB:12:6B:21:39:6F:EA"
]
}
}]
SHA256フィンガープリントはアプリの署名に使用された証明書から取得されます。デバッグビルドには標準のAndroidデバッグ証明書が使用され、リリースビルドにはGoogle Play Consoleの証明書または独自の証明書が使用されます。重要:署名証明書を変更する場合(例:App Signing by Google Playに移行する場合)、サーバー上のassetlinks.jsonを更新する必要があります。そうしないとApp Linkが機能しなくなります。
Androidは最初のリンククリック時にApp Linkを検証します。システムはサーバーからassetlinks.jsonをダウンロードし、package_nameとSHA256フィンガープリントをインストールされたアプリの証明書と照合します。データが一致すると、AndroidはIntent Filterを検証済みとしてマークし、このドメインへの後続のすべてのリンクはダイアログなしで自動的に開かれます。
// AndroidManifest.xml — App LinkのIntent Filter
<activity
android:name=".ui.ProductActivity"
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="https"
android:host="example.com"
android:pathPrefix="/product" />
</intent-filter>
</activity>
autoVerify="true"はAndroidにassetlinks.jsonの検証を指示する必須属性です。この属性がないと、Intent Filterは検証されず、App Linkは有効になりません。Androidは1つのActivityで複数のIntent Filterをサポートしています(異なるホスト用)。システムは各ホストを個別にチェックします。検証は非同期で実行され、最初のクリック時に最大20秒かかる場合があります。
検証が成功すると、Androidは検証済みのIntent Filterに一致するリンクをクリックした際に自動的にアプリを開きます。ユーザーは選択ダイアログを表示せず、アプリが即座に開きます。アプリがインストールされていない場合、リンクはブラウザで開かれます(通常のウェブページとして)。これが理想的なユーザー体験です:不要な操作なしのシームレスな遷移。
重要:自動リダイレクトはhttpsスキームでのみ機能します。App Linkはhttp(非セキュアプロトコル)をサポートしていません。ユーザーが手動でhttpリンクを開いた場合(例:SMSから)、Androidは検証を実行せず、選択ダイアログを表示します。アプリに繋がるすべてのリンクにはhttpsを使用し、サーバーでHTTPからHTTPSへのリダイレクトを設定することを推奨します。
App LinkはAndroidにおけるDeep Linkの進化版であり、置き換えではありません。両者の違いは基本的です。通常のDeep Link(Custom URL Scheme)は、カスタムスキーム(myapp://)を使用し、autoVerifyなしでIntent Filterを介して機能します。Androidはアプリが実際にこのスキームに関連付けられているかどうかをチェックしません。任意のアプリがmyapp://を登録してリンクを傍受できます。
App LinkはDeep Linkの3つの問題を解決します。第一にセキュリティ — Digital Asset Linksによる検証がリンクの傍受を防ぎます。第二にユーザー体験 — 選択ダイアログがないことで、ターゲットアクションへのコンバージョンが20~40%向上します。第三にインデックス — GoogleはhttpsのApp Link URLをインデックスし、検索結果にアプリ内コンテンツへのリンクとして表示できます。
互換性:App LinkはAndroid 6.0+(デバイスの99%)で動作します。Android 5.x(Lollipop)では、選択ダイアログ付きの通常のDeep Linkが使用されます。したがって、両方のメカニズムをサポートすることを推奨します:最新デバイスにはApp Link、古いバージョンにはフォールバックとしてCustom URL Scheme。autoVerify="true"のIntent Filterは後方互換性を損なわず、Android < 6では属性が無視されます。
| 特性 | Deep Link | App Link |
|---|---|---|
| スキーム | カスタム(myapp://) | HTTPS(https://domain) |
| 検証 | なし | assetlinks.json |
| 選択ダイアログ | 表示される | 自動リダイレクト |
| Androidバージョン | API 1+ | API 23+(6.0+) |
| Googleインデックス | なし | あり(https URL) |
App Linkの設定には3つの手順が必要です:マニフェストでのIntent Filterの構成、サーバーへのassetlinks.jsonの配置、検証の確認。最初の手順はAndroidManifest.xmlにandroid:autoVerify="true"のIntent Filterを追加することです。httpsスキーム、ホスト、アプリが処理するパスを指定することが重要です。パスにはサブフォルダ用のワイルドカード(*)を含めることができます。
2番目の手順はassetlinks.jsonの作成です。ファイルはAndroid Studio(Tools → App Links Assistant)で生成できます。アシスタントはデバッグとテストにも役立ちます。ファイルはサーバーの/.well-known/assetlinks.jsonに配置されます。サーバーはContent-Type: application/jsonを返し、リダイレクトなしでHTTPS経由でアクセス可能である必要があります。Google Play ConsoleもPublishingセクションでApp Linkの検証ステータスを表示します。
テスト — 3番目の手順。確認にはadbを使用します:コマンドadb shell am start -W -a android.intent.action.VIEW -d “https://example.com/product/42”でアプリが開きます。アプリの代わりにブラウザが開く場合は、assetlinks.jsonとautoVerifyを確認してください。Android Studio App Links Assistantには組み込みテスターが含まれています。各ドメインとパスの検証ステータスが表示されます。自動テストには、Intent Matcherを使用したAndroid Testing Libraryを使用してください。
Android 12(API 31)ではApp Linkの処理に変更が加えられました。新しいドメイン固有の検証が追加されました。システムはIntent Filter全体ではなく、各リンクを個別にチェックします。これによりセキュリティが向上しますが、新しいパスを追加する際にassetlinks.jsonファイルの更新が必要になります。Android 12ではADBに含まれるAndroid App Links Assistantも導入されました。シェルを介して検証を管理するコマンドです。
複数ドメインは本番環境では一般的なシナリオです。アプリはexample.com、m.example.com、example.orgからのリンクを処理できます。各ドメインには、対応するサーバーに個別のassetlinks.jsonが必要です。マニフェストには複数のIntent Filterが追加されます(ドメインごとに1つ)。すべてのドメインはHTTPS経由でアクセス可能で、独立して検証に合格する必要があります。
App LinkとJetpack Navigationは最新のAndroidアプリでApp Linkを処理する推奨方法です。Jetpack Navigationはnav_graph.xmlまたはNavDeepLinkRequestを介した宣言的deep linkをサポートしています。これによりナビゲーションが簡素化されます。開発者は特定のURLに対してどの画面が開くかを記述し、NavigationコンポーネントがIntentを処理してナビゲーションスタックを復元します。GoogleはApp LinkにJetpack Navigationを使用することを推奨しています。
// Jetpack NavigationによるApp Linkの処理
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handleDeepLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleDeepLink(intent)
}
private fun handleDeepLink(intent: Intent) {
intent.data?.let { uri ->
navController.handleDeepLink(NavDeepLinkRequest
.Builder
.fromUri(uri)
.build()
)
}
}
}
Google Play Storeは公開時にApp Linkをチェックします。マニフェストにautoVerify付きのIntent Filterが含まれているが、assetlinks.jsonが利用できないか正しくない場合、Google Playは警告付きでアップデートを拒否する可能性があります。デベロッパーコンソール(Policy and Programs → App Links)には各ドメインの検証ステータスが表示されます。公開前に必ずステータスを確認してください。アップデート拒否後の修正はリリースを遅らせます。
よくある質問
App LinkはDigital Asset Linksによる検証付きのDeep Linkです。主な違い:App Linkはカスタムスキームではなくhttpsスキームを使用し、選択ダイアログを表示せず、Googleによってインデックスされます。通常のDeep LinkはすべてのAndroidバージョンで動作しますが、手動でアプリを選択する必要があります。
ファイルはHTTPSサーバーのルートの/.well-known/assetlinks.jsonに配置します。サーバーはContent-Type: application/jsonを返す必要があります。署名証明書を変更したり新しいドメインを追加したりする際にはファイルを更新する必要があります。
主な原因:Intent Filterにandroid:autoVerify="true"がない、assetlinks.jsonがHTTPS経由で利用できない、SHA256フィンガープリントが正しくない、署名証明書が異なる(デバッグとリリース)。adb shell dumpsync domain_verificationで検証ステータスを確認してください。
いいえ — App Linkにはアクセス可能なassetlinks.jsonのあるHTTPSサーバーが必要です。ドメインがない場合は、Firebase HostingまたはGitHub Pagesを使用してファイルをホスティングしてください。代替案:Custom URL Scheme(検証なし)またはFirebase Dynamic Links。
いいえ — App LinkはAndroid 6.0(API 23)以上でサポートされています。Android 5では、android:autoVerify="true"付きのIntent Filterは属性を無視し、選択ダイアログ付きの通常のDeep Linkとして動作します。後方互換性のために両方のメカニズムをサポートすることを推奨します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。