Universal Link je mechanismus Apple (iOS 9+), který umožňuje otevírat webové odkazy přímo v aplikaci, aniž by se otevřel Safari. Pokud aplikace není nainstalována, odkaz se bez problémů otevře v prohlížeči. Termín zavedl Apple v roce 2015 na WWDC jako součást Handoff a ekosystému Continuity. Podle Apple Developer poskytuje Universal Link jednotný uživatelský zážitek mezi webem a nativní aplikací bez dialogů výběru.
Hlavní body
Universal Link je standardní HTTPS odkaz ve tvaru https://example.com/page, který po kliknutí ze zařízení iOS otevře nainstalovanou aplikaci místo Safari. Hlavní rozdíl oproti Custom URL Scheme: Universal Link nevyžaduje registraci vlastního schématu (myapp://) — používá se běžná doména. Tím se eliminuje problém URL Scheme hijacking, kdy jakákoli aplikace může zaregistrovat stejné schéma.
Apple představil Universal Link na WWDC 2015 v rámci iOS 9. Mechanismus se stal součástí ekosystému Handoff a Spotlight: Universal Link funguje nejen v prohlížeči, ale také ve výsledcích vyhledávání Spotlight, v Mail, Messages a dalších systémových aplikacích. Kromě toho je Universal Link podporován v watchOS a macOS — uživatel může otevřít aplikaci na iPhonu pomocí odkazu na Macu.
Klíčová výhoda: jednotné URL. Vývojář nespravuje dva různé odkazy (jeden pro web, druhý pro aplikaci). Universal Link je stejný https odkaz. Pokud je aplikace nainstalována — otevře se ona. Pokud ne — stejný odkaz se otevře v Safari jako běžná webová stránka. To poskytuje ideální fallback bez ztráty návštěvnosti.
Mechanismus Universal Link se skládá ze tří fází: ověření asociace, zpracování odkazu a fallback do prohlížeče. Každá fáze je kritická pro správnou funkci. Pokud asociace není nakonfigurována, iOS považuje odkaz za běžný přechod do Safari. Podívejme se na každou fázi podrobně.
Při prvním kliknutí na odkaz iOS stáhne soubor apple-app-site-association ze serveru na adrese https://example.com/.well-known/apple-app-site-association. Soubor obsahuje JSON s identifikátorem Team ID a Bundle ID aplikace a seznam cest, které má aplikace otevírat. iOS tento soubor ukládá do mezipaměti a pravidelně kontroluje jeho aktuálnost (při aktualizaci aplikace, restartu zařízení).
JSON soubor apple-app-site-association musí být přístupný přes HTTPS bez přesměrování. Server musí vracet Content-Type: application/json. Důležité: soubor nemá příponu .json — iOS jej hledá striktně na cestě /.well-known/apple-app-site-association. Apple také doporučuje přidat podporu pro Universal Link v CDN a zkontrolovat, že soubor není blokován robots.txt.
// apple-app-site-association — minimální konfigurace
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/profile/*", "/search"]
}
]
}
}
appID se tvoří jako Team ID + Bundle ID (TEAMID.com.example.app). paths — pole URL vzorů, které má aplikace zpracovávat. Lze použít *, ? a NOT notaci: ["NOT /admin/*", "/product/*"]. Cesty se kontrolují v pořadí výčtu: první shoda určuje chování. Pokud cesta neodpovídá — odkaz se otevře v Safari.
Po úspěšném ověření asociace iOS předá odkaz aplikaci. Zpracování probíhá v AppDelegate přes metodu application(_:continue:restorationHandler:) pro NSUserActivity nebo v SceneDelegate přes scene(_:continue:). Vývojář obdrží objekt NSUserActivity s typem NSUserActivityTypeBrowsingWeb, extrahuje URL a naviguje na odpovídající obrazovku.
// Zpracování Universal Link v AppDelegate
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping UIUserActivityRestorationHandler
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL
else { return false }
// Navigace na obrazovku podle URL
DeepLinkRouter.navigate(to: url)
return true
}
DeepLinkRouter v uvedeném příkladu je vlastní třída, která parsuje URL a volá příslušný navigační koordinátor. Pro SwiftUI se zpracování provádí pomocí metody onOpenURL nebo modifikátoru environment(\.openURL). Je důležité zpracovat nejen spuštění v popředí (foreground), ale také případ, kdy aplikace není spuštěna (cold start): Universal Link v tomto případě otevře aplikaci pomocí možností spuštění.
Pokud aplikace není nainstalována, iOS automaticky otevře Universal Link v Safari. To je klíčový rozdíl oproti Custom URL Scheme: uživatel nevidí chybu. Fallback je standardní webová stránka stejné domény. Vývojář může na této stránce umístit odkaz na App Store, informace o produktu nebo alternativní obsah.
Důležité: fallback nelze přizpůsobit na úrovni iOS. iOS jednoduše otevře URL v Safari. Chcete-li zobrazit odlišný obsah uživatelům s nainstalovanou a nenainstalovanou aplikací, použijte Smart App Banner (meta tag pro Safari navrhující otevření aplikace) nebo detekci instalace aplikace pomocí JavaScriptu. Apple také poskytuje SKAdNetwork pro atribuci instalací prostřednictvím Universal Link.
Universal Link a tradiční Deep Link (Custom URL Scheme) řeší stejný úkol, ale zásadně se liší architekturou a bezpečností. Custom URL Scheme — vlastní protokol (myapp://), který se registruje v Info.plist. Jakákoli aplikace může zaregistrovat stejné schéma (myapp://) a iOS nemůže určit, která je „skutečná". Tomu se říká URL Scheme hijacking.
Universal Link řeší problém hijackingu pomocí ověření domény. Pouze vlastník domény může umístit apple-app-site-association na svůj server a potvrdit spojení s konkrétním Bundle ID. Dvě aplikace nemohou zaregistrovat stejný Universal Link: pokud dojde ke konfliktu, iOS dá prioritu naposledy nainstalované aplikaci nebo otevře Safari.
Další rozdíl: Fallback. Custom URL Scheme nemá fallback — pokud aplikace není nainstalována, prohlížeč zobrazí chybu. Universal Link otevře web. Jednotné URL znamená, že SEO hodnota odkazu zůstává zachována (odkaz je indexován Googlem) a uživatel s jakýmkoli zařízením obdrží relevantní obsah. Universal Link je evoluční krok od deep link k unified link.
| Vlastnost | Custom URL Scheme | Universal Link |
|---|---|---|
| Formát | myapp://path | https://domain/path |
| Ověření | Ne | apple-app-site-association |
| Bezpečnost | Zranitelný vůči hijackingu | Pouze vlastník domény |
| Fallback | Chyba | Web v Safari |
| Verze iOS | iOS 3+ | iOS 9+ |
Nastavení Universal Link zahrnuje serverovou a klientskou část. Serverová část — umístění souboru apple-app-site-association na adrese https://domain/.well-known/apple-app-site-association. Klientská část — registrace domény v Associated Domains v Xcode (Capabilities → Associated Domains → applinks:example.com). Poté aplikace automaticky přijímá všechny Universal Link pro zadanou doménu.
Kroky nastavení:
Ladění Universal Link — častá bolest hlavy iOS vývojářů. Hlavní příčiny nefunkčních odkazů: soubor apple-app-site-association není dostupný přes HTTPS, nesprávné appID, Content-Type není application/json, přesměrování z cesty /.well-known, ukládání staré verze do mezipaměti (reset přes Settings → Developer → Associated Domains Development). Apple poskytuje nástroj "Validation Checker" v Apple Developer Console pro testování asociace.
Branch a další MMP platformy zjednodušují nastavení Universal Link: generují apple-app-site-association automaticky a hostují jej na své vlastní doméně. Vývojář stačí přidat doménu Branch do Associated Domains a integrovat SDK. To je zvláště výhodné pro startupy, které nemají vlastní serverovou infrastrukturu pro hostování AASA souboru.
Universal Link má několik omezení. Za prvé: soubor apple-app-site-association musí být přístupný striktně přes HTTPS (HTTP není podporováno). Za druhé: odkaz musí vést na stejnou doménu, která je uvedena v Associated Domains. Mezidoménové Universal Link nefungují — pro každou doménu je potřeba samostatný záznam v Capabilities a samostatný AASA soubor. Za třetí: Universal Link nefunguje ve WKWebView — pouze v Safari a systémových komponentách.
Kompatibilita: iOS 9.0+ (Universal Link), watchOS 6.0+ (Handoff Universal Link), macOS 10.15+ (Catalyst a Mac aplikace). Ve starších verzích iOS se odkaz otevře v Safari. To znamená, že na iOS 8 (méně než 1 % zařízení) Universal Link nebude fungovat. Doporučuje se podporovat také Custom URL Scheme jako fallback pro stará zařízení, pokud publikum zahrnuje uživatele se zastaralými verzemi.
Změny v iOS 16+: Apple vylepšil zpracování Universal Link pro SwiftUI. Objevil se nový modifikátor environment(\.openURL) s možností odloženého zpracování. iOS 16 také umožňuje otevřít Universal Link v aplikaci dokonce i přes SFSafariViewController. Pro uživatele iOS 16 se doporučuje zcela přejít na SwiftUI zpracování Universal Link a ponechat kód AppDelegate pouze pro zpětnou kompatibilitu.
Často kladené otázky
Universal Link používá standardní HTTPS-URL a je ověřován prostřednictvím souboru na serveru. Custom URL Scheme používá vlastní protokol (myapp://) bez ověření, což jej činí zranitelným vůči zachycení jinou aplikací, která zaregistrovala stejné schéma.
Soubor se umísťuje do kořene HTTPS serveru na cestu /.well-known/apple-app-site-association (bez přípony .json). Server musí vracet Content-Type: application/json. Důležité: žádná přesměrování, soubor musí být přímo přístupný.
Hlavní příčiny: nesprávné Team ID nebo Bundle ID v AASA souboru, soubor není dostupný přes HTTPS, přesměrování, nesprávný Content-Type, ukládání staré verze do mezipaměti. Zkontrolujte přes Developer → Associated Domains Development a resetujte mezipaměť restartováním zařízení.
Ne — Universal Link vyžaduje HTTPS server, na kterém je umístěn apple-app-site-association. Bez domény Universal Link nefunguje. Alternativa: Custom URL Scheme (méně bezpečné) nebo služby třetích stran (Branch, Firebase) s vlastní doménou.
Ne — Universal Link je exkluzivní technologie Apple pro iOS, iPadOS, watchOS a macOS. Na Androidu se analog nazývá App Link (Android 6.0+), který používá Digital Asset Links (assetlinks.json) místo apple-app-site-association.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také