Az Universal Link egy Apple-mechanizmus (iOS 9+), amely lehetővé teszi a webes hivatkozások közvetlen megnyitását az alkalmazásban, megkerülve a Safarit. Ha az alkalmazás nincs telepítve, a hivatkozás zökkenőmentesen megnyílik a böngészőben. A kifejezést az Apple vezette be 2015-ben a WWDC-n a Handoff és a Continuity ökoszisztéma részeként. Az Apple Developer szerint az Universal Link egységes felhasználói élményt biztosít a web és a natív alkalmazás között választási párbeszédablakok nélkül.
Főbb pontok
Universal Link egy szabványos HTTPS-hivatkozás https://example.com/page formában, amely iOS-eszközről kattintva a telepített alkalmazást nyitja meg a Safari helyett. A fő különbség a Custom URL Scheme-hez képest: az Universal Link nem igényli egyéni séma (myapp://) regisztrálását — egy szokásos domain kerül felhasználásra. Ez kiküszöböli az URL Scheme hijacking problémáját, amikor bármely alkalmazás regisztrálhatja ugyanazt a sémát.
Az Apple a WWDC 2015-ön mutatta be az Universal Link-et az iOS 9 keretében. A mechanizmus a Handoff és a Spotlight ökoszisztéma részévé vált: az Universal Link nemcsak a böngészőben működik, hanem a Spotlight keresési eredményeiben, a Mail, Messages és más rendszeralkalmazásokban is. Ezenkívül az Universal Link támogatott a watchOS-ben és macOS-ben — a felhasználó megnyithatja az alkalmazást iPhone-on egy Mac-en lévő hivatkozáson keresztül.
A legfontosabb előny: egységes URL. A fejlesztő nem kezel két különböző hivatkozást (egyet a webhez, egyet az alkalmazáshoz). Az Universal Link ugyanaz a https-hivatkozás. Ha az alkalmazás telepítve van — az nyílik meg. Ha nem — ugyanaz a hivatkozás nyílik meg a Safari-ban szokásos weboldalként. Ez ideális fallback-et biztosít forgalom elvesztése nélkül.
Az Universal Link mechanizmusa három szakaszból áll: asszociáció ellenőrzése, hivatkozás feldolgozása és fallback a böngészőbe. Minden szakasz kritikus a helyes működéshez. Ha az asszociáció nincs beállítva, az iOS a hivatkozást szokásos Safari-ba történő átmenetként kezeli. Vizsgáljuk meg részletesen az egyes szakaszokat.
A hivatkozás első kattintásakor az iOS letölti az apple-app-site-association fájlt a szerverről a https://example.com/.well-known/apple-app-site-association címen. A fájl JSON-t tartalmaz a Team ID és Bundle ID azonosítókkal, valamint azon útvonalak listájával, amelyeket az alkalmazásnak meg kell nyitnia. Az iOS gyorsítótárazza ezt a fájlt, és időszakosan ellenőrzi annak aktualitását (alkalmazás frissítésekor, eszköz újraindításakor).
JSON-fájl az apple-app-site-association-nak HTTPS-en keresztül kell elérhetőnek lennie átirányítások nélkül. A szervernek Content-Type: application/json értéket kell visszaadnia. Fontos: a fájl nem rendelkezik .json kiterjesztéssel — az iOS szigorúan a /.well-known/apple-app-site-association útvonalon keresi. Az Apple azt is javasolja, hogy adjon hozzá Universal Link-támogatást a CDN-ben, és ellenőrizze, hogy a fájl nincs blokkolva a robots.txt által.
// apple-app-site-association — minimális konfiguráció
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/profile/*", "/search"]
}
]
}
}
appID Team ID + Bundle ID (TEAMID.com.example.app) formában kerül kialakításra. paths — az alkalmazás által feldolgozandó URL-minták tömbje. Használható *, ? és NOT jelölés: ["NOT /admin/*", "/product/*"]. Az útvonalak a felsorolás sorrendjében kerülnek ellenőrzésre: az első egyezés határozza meg a viselkedést. Ha az útvonal nem egyezik — a hivatkozás a Safari-ban nyílik meg.
Az asszociáció sikeres ellenőrzése után az iOS továbbítja a hivatkozást az alkalmazásnak. A feldolgozás az AppDelegate-ben történik az application(_:continue:restorationHandler:) metódussal NSUserActivity esetén, vagy a SceneDelegate-ben a scene(_:continue:) metódussal. A fejlesztő egy NSUserActivity objektumot kap NSUserActivityTypeBrowsingWeb típussal, kivonja az URL-t és a megfelelő képernyőre navigál.
// Universal Link feldolgozása az AppDelegate-ben
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping UIUserActivityRestorationHandler
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL
else { return false }
// Navigáció a képernyőre az URL szerint
DeepLinkRouter.navigate(to: url)
return true
}
A fenti példában a DeepLinkRouter egy egyéni osztály, amely elemzi az URL-t és meghívja a megfelelő navigációs koordinátort. SwiftUI esetén a feldolgozás az onOpenURL metódussal vagy az environment(\.openURL) módosítóval történik. Fontos, hogy ne csak az előtérben történő indítást (foreground) dolgozza fel, hanem azt az esetet is, amikor az alkalmazás nincs elindítva (cold start): az Universal Link ebben az esetben az indítási opciókon keresztül nyitja meg az alkalmazást.
Ha az alkalmazás nincs telepítve, az iOS automatikusan megnyitja az Universal Link-et a Safari-ban. Ez a fő különbség a Custom URL Scheme-hez képest: a felhasználó nem lát hibát. A fallback ugyanazon domain szabványos weboldala. A fejlesztő ezen az oldalon elhelyezhet egy hivatkozást az App Store-ba, termékinformációt vagy alternatív tartalmat.
Fontos: a fallback nem testreszabható iOS szinten. Az iOS egyszerűen megnyitja az URL-t a Safari-ban. Ha eltérő tartalmat szeretne megjeleníteni a telepített és nem telepített alkalmazással rendelkező felhasználóknak, használja a Smart App Banner-t (meta-címke a Safari számára, amely az alkalmazás megnyitását javasolja) vagy JavaScript-észlelést az alkalmazás telepítésének felismerésére. Az Apple a SKAdNetwork-öt is biztosítja a telepítések attribúciójához Universal Link-en keresztül.
Az Universal Link és a hagyományos Deep Link (Custom URL Scheme) ugyanazt a feladatot oldja meg, de alapvetően különböznek az architektúrában és biztonságban. Custom URL Scheme — egy egyéni protokoll (myapp://), amely az Info.plist-ben regisztrálódik. Bármely alkalmazás regisztrálhatja ugyanazt a sémát (myapp://), és az iOS nem tudja meghatározni, melyik az "igazi". Ezt URL Scheme hijacking-nek nevezzük.
Universal Link a hijacking problémáját domain-ellenőrzésen keresztül oldja meg. Csak a domain tulajdonosa helyezhet el apple-app-site-association-t a szerverén, megerősítve a kapcsolatot egy adott Bundle ID-val. Két alkalmazás nem regisztrálhatja ugyanazt az Universal Link-et: ha konfliktus merül fel, az iOS az utoljára telepített alkalmazásnak ad prioritást, vagy megnyitja a Safarit.
Másik különbség: Fallback. A Custom URL Scheme-nek nincs fallback-je — ha az alkalmazás nincs telepítve, a böngésző hibát jelenít meg. Az Universal Link megnyitja a weboldalt. Az egységes URL azt jelenti, hogy a hivatkozás SEO-értéke megmarad (a hivatkozást a Google indexeli), és a felhasználó bármilyen eszközzel releváns tartalmat kap. Az Universal Link evolúciós lépés a deep link-től a unified link felé.
| Jellemző | Custom URL Scheme | Universal Link |
|---|---|---|
| Formátum | myapp://path | https://domain/path |
| Ellenőrzés | Nem | apple-app-site-association |
| Biztonság | Sérülékeny hijacking-re | Csak domain tulajdonosa |
| Fallback | Hiba | Weboldal Safari-ban |
| iOS verzió | iOS 3+ | iOS 9+ |
Beállítás az Universal Link szerver- és kliensoldali részeket foglal magában. Szerveroldali rész — az apple-app-site-association fájl elhelyezése a https://domain/.well-known/apple-app-site-association címen. Kliensoldali rész — a domain regisztrálása az Associated Domains-ben az Xcode-ban (Capabilities → Associated Domains → applinks:example.com). Ezt követően az alkalmazás automatikusan megkapja az összes Universal Link-et a megadott domainhez.
Beállítás lépései:
Hibakeresés Universal Link — gyakori fejfájás iOS-fejlesztők számára. A nem működő hivatkozások fő okai: az apple-app-site-association fájl nem érhető el HTTPS-en keresztül, helytelen appID, a Content-Type nem application/json, átirányítás a /.well-known útvonalról, a régi verzió gyorsítótárazása (visszaállítás a Settings → Developer → Associated Domains Development menüpontban). Az Apple a „Validation Checker" eszközt biztosítja az Apple Developer Console-ban az asszociáció teszteléséhez.
Branch és más MMP-platformok egyszerűsítik az Universal Link beállítását: automatikusan generálják az apple-app-site-association-t és saját domainjükön hosztolják. A fejlesztőnek csak a Branch domaint kell hozzáadnia az Associated Domains-hez és integrálnia az SDK-t. Ez különösen kényelmes azon startupok számára, amelyek nem rendelkeznek saját szerverinfrastruktúrával az AASA-fájl hosztolásához.
Universal Link számos korlátozással rendelkezik. Első: az apple-app-site-association fájlnak szigorúan HTTPS-en keresztül kell elérhetőnek lennie (HTTP nem támogatott). Második: a hivatkozásnak ugyanarra a domainre kell mutatnia, amely az Associated Domains-ben van megadva. Több domain közötti Universal Link nem működik — minden domainhez külön bejegyzés szükséges a Capabilities-ben és külön AASA-fájl. Harmadik: az Universal Link nem működik WKWebView-ban — csak Safari-ban és rendszerkomponensekben.
Kompatibilitás: iOS 9.0+ (Universal Link), watchOS 6.0+ (Handoff Universal Link), macOS 10.15+ (Catalyst és Mac alkalmazások). Az iOS régebbi verzióiban a hivatkozás a Safari-ban nyílik meg. Ez azt jelenti, hogy iOS 8-on (az eszközök kevesebb mint 1%-a) az Universal Link nem fog működni. Javasolt a Custom URL Scheme támogatása is fallback-ként a régi eszközökhöz, ha a közönség tartalmaz elavult verziójú felhasználókat.
iOS 16+ változások: Az Apple javította az Universal Link feldolgozását SwiftUI esetén. Megjelent egy új environment(\.openURL) módosító késleltetett feldolgozási lehetőséggel. Az iOS 16 lehetővé teszi az Universal Link megnyitását az alkalmazásban akár SFSafariViewController-en keresztül is. iOS 16 felhasználók számára javasolt a teljes átállás a SwiftUI-alapú Universal Link feldolgozásra, az AppDelegate kódot csak visszamenőleges kompatibilitás céljából megtartva.
Gyakran ismételt kérdések
Universal Link szabványos HTTPS-URL-t használ, és egy szerveren lévő fájlon keresztül ellenőrződik. A Custom URL Scheme egyéni protokollt (myapp://) használ ellenőrzés nélkül, ami sebezhetővé teszi egy másik, ugyanazt a sémát regisztráló alkalmazás általi elfogásra.
A fájl a HTTPS-szerver gyökerébe kerül a /.well-known/apple-app-site-association útvonalon (.json kiterjesztés nélkül). A szervernek Content-Type: application/json-t kell visszaadnia. Fontos: nincs átirányítás, a fájlnak közvetlenül elérhetőnek kell lennie.
Fő okok: helytelen Team ID vagy Bundle ID az AASA-fájlban, a fájl nem érhető el HTTPS-en keresztül, átirányítás, helytelen Content-Type, régi verzió gyorsítótárazása. Ellenőrizze a Developer → Associated Domains Development menüpontban, és állítsa vissza a gyorsítótárat az eszköz újraindításával.
Nem — az Universal Linkhez HTTPS-szerver szükséges, amelyen az apple-app-site-association található. Domain nélkül az Universal Link nem működik. Alternatíva: Custom URL Scheme (kevésbé biztonságos) vagy harmadik fél szolgáltatásai (Branch, Firebase) saját domainnel.
Nem — az Universal Link az Apple kizárólagos technológiája iOS, iPadOS, watchOS és macOS rendszerekhez. Androidon a megfelelője App Link (Android 6.0+) néven ismert, amely apple-app-site-association helyett Digital Asset Links (assetlinks.json) fájlt használ.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is