Universal Linkは、Safariを経由せずにウェブリンクをアプリで直接開くことができるAppleのメカニズム(iOS 9+)です。アプリがインストールされていない場合、リンクはブラウザでシームレスに開かれます。この用語は、2015年のWWDCでHandoffおよびContinuityエコシステムの一部としてAppleによって導入されました。Apple Developerによると、Universal Linkは選択ダイアログなしでウェブとネイティブアプリ間の統一されたユーザーエクスペリエンスを提供します。
重要なポイント
Universal Linkとは、iOSデバイスからタップすると、Safariの代わりにインストールされたアプリを開くhttps://example.com/pageのような標準的なHTTPSリンクです。Custom URL Schemeとの主な違い:Universal Linkはカスタムスキーム(myapp://)の登録を必要としません — 通常のドメインを使用します。これにより、任意のアプリが同じスキームを登録できるURL Schemeハイジャック問題を排除します。
AppleはWWDC 2015でiOS 9の一部としてUniversal Linkを発表しました。このメカニズムはHandoffおよびSpotlightエコシステムの一部となりました。Universal Linkはブラウザだけでなく、Spotlight検索結果、Mail、Messages、その他のシステムアプリでも機能します。さらに、Universal LinkはwatchOSとmacOSでもサポートされています — ユーザーはMacのリンクを介してiPhoneでアプリを開くことができます。
主な利点:統一URL。開発者は2つの異なるリンク(ウェブ用とアプリ用)を管理する必要がありません。Universal Linkは同じhttpsリンクです。アプリがインストールされていればアプリが開き、インストールされていなければ同じリンクがSafariで通常のウェブページとして開きます。これにより、トラフィックを失うことなく理想的なフォールバックを提供します。
Universal Linkのメカニズムは、関連付けの検証、リンク処理、ブラウザフォールバックの3つの段階で構成されています。各段階は正しい動作にとって重要です。関連付けが設定されていない場合、iOSはリンクをSafariへの通常のリダイレクトとして処理します。各段階を詳しく見ていきましょう。
リンクを最初にタップすると、iOSはサーバーからhttps://example.com/.well-known/apple-app-site-associationにあるapple-app-site-associationファイルをダウンロードします。ファイルには、アプリのTeam IDとBundle IDを含むJSONと、アプリが開くべきパスのリストが含まれています。iOSはこのファイルをキャッシュし、定期的にその鮮度を確認します(アプリアップデート時、デバイス再起動時)。
JSONファイル apple-app-site-associationは、リダイレクトなしでHTTPS経由でアクセス可能でなければなりません。サーバーはContent-Type: application/jsonを返す必要があります。重要なのは、ファイルに.json拡張子がないことです — iOSはそれを厳密に/.well-known/apple-app-site-associationで探します。AppleはCDNでのUniversal Linkサポートの追加と、robots.txtによってファイルがブロックされていないことの確認も推奨しています。
// apple-app-site-association — 最小構成
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/profile/*", "/search"]
}
]
}
}
appIDはTeam ID + Bundle ID(TEAMID.com.example.app)として形成されます。pathsはアプリが処理するURLパターンの配列です。*、?、およびNOT表記を使用できます:["NOT /admin/*", "/product/*"]。パスは列挙順にチェックされ、最初に一致したものが動作を決定します。パスが一致しない場合、リンクはSafariで開かれます。
関連付けの検証が成功すると、iOSはリンクをアプリに渡します。処理は、NSUserActivityの場合はAppDelegateのapplication(_:continue:restorationHandler:)メソッド、またはSceneDelegateのscene(_:continue:)を介して行われます。開発者はNSUserActivityTypeBrowsingWebタイプのNSUserActivityオブジェクトを受け取り、URLを抽出して対応する画面に遷移します。
// AppDelegateでのUniversal Link処理
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping UIUserActivityRestorationHandler
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL
else { return false }
// URLに応じた画面への遷移
DeepLinkRouter.navigate(to: url)
return true
}
上記の例のDeepLinkRouterは、URLを解析して対応するナビゲーションコーディネーターを呼び出すカスタムクラスです。SwiftUIの場合、処理はonOpenURLメソッドまたはenvironment(\.openURL)修飾子を介して行われます。フォアグラウンド起動だけでなく、アプリが実行されていなかった場合(コールドスタート)も処理することが重要です。この場合、Universal Linkは起動オプションを介してアプリを開きます。
アプリがインストールされていない場合、iOSは自動的にSafariでUniversal Linkを開きます。これがCustom URL Schemeとの主な違いです:ユーザーはエラーを表示しません。フォールバックは同じドメインの標準的なウェブページです。開発者はこのページにApp Storeへのリンク、製品情報、または代替コンテンツを配置できます。
重要:フォールバックはiOSレベルではカスタマイズできません。iOSは単にSafariでURLを開くだけです。アプリがインストールされているユーザーとインストールされていないユーザーで異なるコンテンツを表示するには、Smart App Banner(アプリを開くことを提案するSafariのメタタグ)またはJavaScriptによるインストール検出を使用してください。AppleはUniversal Linkを介したインストール属性のためにSKAdNetworkも提供しています。
Universal Linkと従来のDeep Link(Custom URL Scheme)は同じ問題を解決しますが、アーキテクチャとセキュリティにおいて根本的に異なります。Custom URL SchemeはInfo.plistに登録されるカスタムプロトコル(myapp://)です。任意のアプリが同じスキーム(myapp://)を登録でき、iOSはどれが「本物」かを判断できません。これをURL Schemeハイジャックと呼びます。
Universal Linkはドメイン検証を通じてハイジャック問題を解決します。ドメイン所有者のみがサーバーにapple-app-site-associationを配置し、特定のBundle IDとの接続を確認できます。2つのアプリが同じUniversal Linkを登録することはできません:競合が発生した場合、iOSは最後にインストールされたアプリを優先するか、Safariを開きます。
もう1つの違い:フォールバック。Custom URL Schemeにはフォールバックがありません — アプリがインストールされていない場合、ブラウザはエラーを表示します。Universal Linkはウェブサイトを開きます。統一URLにより、リンクのSEO価値が保持され(Googleがリンクをインデックス)、どのデバイスのユーザーも関連コンテンツを受け取ります。Universal Linkは、ディープリンクから統合リンクへの進化的ステップです。
| 特性 | Custom URL Scheme | Universal Link |
|---|---|---|
| 形式 | myapp://path | https://domain/path |
| 検証 | なし | apple-app-site-association |
| セキュリティ | ハイジャックに対して脆弱 | ドメイン所有者のみ |
| フォールバック | エラー | Safariのウェブサイト |
| iOSバージョン | iOS 3+ | iOS 9+ |
設定にはサーバー側とクライアント側の両方が含まれます。サーバー側 — apple-app-site-associationファイルをhttps://domain/.well-known/apple-app-site-associationに配置します。クライアント側 — XcodeのAssociated Domainsにドメインを登録します(Capabilities → Associated Domains → applinks:example.com)。その後、アプリは指定されたドメインのすべてのUniversal Linkを自動的に受信します。
設定手順:
デバッグはiOS開発者にとって一般的な悩みの種です。リンクが機能しない主な原因:apple-app-site-associationファイルがHTTPS経由でアクセス不可、appIDの誤り、Content-Typeがapplication/jsonではない、/.well-knownパスからのリダイレクト、古いバージョンのキャッシュ(Settings → Developer → Associated Domains Developmentでリセット)。AppleはApple Developer Consoleで関連付けをテストするためのValidation Checkerツールを提供しています。
Branchやその他のMMPプラットフォームはUniversal Linkの設定を簡素化します:自動的にapple-app-site-associationを生成し、自社のドメインでホスティングします。開発者はAssociated DomainsにBranchドメインを追加してSDKを統合するだけで済みます。これは特に、AASAファイルをホスティングする独自のサーバーインフラを持たないスタートアップにとって便利です。
Universal Linkにはいくつかの制限があります。第一に:apple-app-site-associationファイルは厳密にHTTPS経由でアクセス可能でなければなりません(HTTPはサポートされていません)。第二に:リンクはAssociated Domainsで指定された同じドメインを指す必要があります。クロスドメインのUniversal Linkは機能しません — 各ドメインにCapabilitiesでの個別のエントリと個別のAASAファイルが必要です。第三に:Universal LinkはWKWebViewでは機能しません — Safariおよびシステムコンポーネントのみで動作します。
互換性:iOS 9.0+(Universal Link)、watchOS 6.0+(Handoff Universal Link)、macOS 10.15+(CatalystおよびMacアプリ)。古いiOSバージョンでは、リンクはSafariで開かれます。つまり、iOS 8(デバイスの1%未満)ではUniversal Linkは機能しません。対象ユーザーに古いバージョンのユーザーが含まれる場合は、古いデバイス用のフォールバックとしてCustom URL Schemeもサポートすることをお勧めします。
iOS 16+の変更点:AppleはSwiftUIのUniversal Link処理を改善しました。遅延処理機能を備えた新しいenvironment(\.openURL)修飾子が導入されました。iOS 16では、SFSafariViewControllerを介してもアプリでUniversal Linkを開くことができるようになりました。iOS 16ユーザーの場合は、完全にSwiftUIのUniversal Link処理に移行し、AppDelegateコードは後方互換性のためだけに残すことをお勧めします。
よくある質問
Universal Linkは標準的なHTTPS URLを使用し、サーバー上のファイルを介して検証されます。Custom URL Schemeは検証なしでカスタムプロトコル(myapp://)を使用するため、同じスキームを登録した別のアプリによる傍受に対して脆弱です。
ファイルはHTTPSサーバーのルートの/.well-known/apple-app-site-association(.json拡張子なし)に配置します。サーバーはContent-Type: application/jsonを返す必要があります。重要:リダイレクトなしで、ファイルは直接アクセス可能でなければなりません。
主な原因:AASAファイルのTeam IDまたはBundle IDの誤り、HTTPS経由でファイルにアクセス不可、リダイレクト、Content-Typeの誤り、古いバージョンのキャッシュ。Developer → Associated Domains Developmentで確認し、デバイスを再起動してキャッシュをクリアしてください。
いいえ — Universal Linkにはapple-app-site-associationをホストするHTTPSサーバーが必要です。ドメインなしではUniversal Linkは機能しません。代替案:Custom URL Scheme(安全性は低い)または独自ドメインを持つサードパーティサービス(Branch、Firebase)。
いいえ — Universal LinkはiOS、iPadOS、watchOS、macOS向けのApple独自の技術です。Androidでは、同等の機能はApp Link(Android 6.0+)と呼ばれ、apple-app-site-associationの代わりにDigital Asset Links(assetlinks.json)を使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。