Android と iOS のアプリ開発をしていると、
「同じURLなのに、Androidはアプリが起動して、iOSはブラウザが開く」
といった挙動に悩まされることがあります。
この原因の多くは、
App Links(Android) と Universal Links(iOS) の
仕組みの違いを正しく理解できていないことにあります。
この記事では、両者の違いを
仕組み・実装方法・確認ポイント・ハマりやすい罠
という観点で、実務目線で整理します。
まず結論:App Links と Universal Links は「似て非なるもの」
どちらも「https の URL をタップするとアプリが起動する」仕組みですが、
成立条件と OS 側の扱いが大きく異なります。
- Android:App Links
Intent Filter を起点に、OS がドメインとアプリの関連を自動検証 - iOS:Universal Links
Associated Domains を起点に、OS がアプリとドメインを関連付け
つまり、
Android は「アプリ主導」
iOS は「OS / ドメイン主導」
という考え方をすると理解しやすいです。
Android:App Links の仕組み
App Links が成立する条件
- https の Intent Filter が定義されている
android:autoVerify="true"が付いている- サーバーに assetlinks.json が配置されている
- packageName と SHA-256(署名)が一致している
AndroidManifest.xml の例
<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="/article" />
</intent-filter>
assetlinks.json の例
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [
"AA:BB:CC:DD:..."
]
}
}
]
App Links が動かない原因で一番多いのは、
リリース証明書ではなくデバッグ証明書の SHA-256 を使っているケースです。
iOS:Universal Links の仕組み
Universal Links が成立する条件
- Associated Domains が有効化されている
applinks:example.comが設定されている- サーバーに apple-app-site-association が配置されている
apple-app-site-association の例
{
"applinks": {
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": [ "/article/*" ]
}
]
}
}
iOS の場合、
Safari の挙動・OS のキャッシュ・ユーザー操作の影響を強く受けるため、
「設定は合っているのに動かない」状態が発生しやすいです。
App Links と Universal Links の比較表
| 項目 | Android(App Links) | iOS(Universal Links) |
|---|---|---|
| 起点 | Intent Filter | Associated Domains |
| サーバーファイル | assetlinks.json | apple-app-site-association |
| 証明情報 | SHA-256(署名) | Team ID / Bundle ID |
| ユーザー影響 | 端末の「対応リンク」設定 | Safari の挙動・履歴 |
よくあるハマりポイント
- Android:assetlinks.json はあるが SHA が違う
- iOS:AASA がリダイレクトされている
- SNS アプリ内ブラウザでは動かない
- 端末側でリンク関連付けが無効になっている
両方に共通して言えるのは、
「実装だけでなく、端末・OS・ユーザー状態も含めて設計する必要がある」
という点です。
まとめ
App Links と Universal Links は、
同じ役割を持ちながら、思想も実装も別物です。
Android / iOS 両対応アプリでは、
「なぜ片方だけ動かないのか?」を説明できる状態にしておくことが重要です。
リンク起動まわりでハマったときの備忘録として、
この記事が役立てば幸いです。



コメント