Universal Link је Apple механизам (iOS 9+) који омогућава отварање веб линкова директно у апликацији, заобилазећи Safari. Ако апликација није инсталирана, линк се беспрекорно отвара у прегледачу. Термин је увео Apple 2015. године на WWDC-у као део Handoff-а и Continuity екосистема. Према Apple Developer-у, Universal Link обезбеђује јединствено корисничко искуство између веба и нативне апликације без дијалога за избор.
Главне тачке
Universal Link је стандардни HTTPS линк облика https://example.com/page који при клику са iOS уређаја отвара инсталирану апликацију уместо Safari-ја. Главна разлика у односу на Custom URL Scheme: Universal Link не захтева регистрацију прилагођене шеме (myapp://) — користи се обичан домен. Ово елиминише проблем URL Scheme hijacking, када било која апликација може да региструје исту шему.
Apple је представио Universal Link на WWDC 2015 у оквиру iOS 9. Механизам је постао део Handoff и Spotlight екосистема: Universal Link ради не само у прегледачу, већ и у резултатима Spotlight претраге, у Mail, Messages и другим системским апликацијама. Поред тога, Universal Link је подржан у watchOS и macOS — корисник може да отвори апликацију на iPhone-у преко линка на Mac-у.
Кључна предност: јединствени URL. Програмер не управља са два различита линка (једним за веб, другим за апликацију). Universal Link је исти хттпс линк. Ако је апликација инсталирана — отвара се она. Ако није — исти линк се отвара у Safari-ју као обична веб страница. Ово пружа идеалан fallback без губитка саобраћаја.
Механизам Universal Link-а се састоји од три фазе: провера асоцијације, обрада линка и fallback у прегледач. Свака фаза је критична за исправан рад. Ако асоцијација није подешена, iOS третира линк као обичан прелаз у Safari. Погледајмо сваку фазу детаљно.
При првом клику на линк, iOS преузима фајл apple-app-site-association са сервера на адреси https://example.com/.well-known/apple-app-site-association. Фајл садржи JSON са идентификатором Team ID и Bundle ID апликације, као и листу путања које апликација треба да отвара. iOS кешира овај фајл и периодично проверава његову актуелност (при ажурирању апликације, поновном покретању уређаја).
JSON фајл apple-app-site-association мора бити доступан преко HTTPS-а без преусмеравања. Сервер мора да враћа Content-Type: application/json. Важно: фајл нема екстензију .json — iOS га тражи строго на путањи /.well-known/apple-app-site-association. Apple такође препоручује додавање подршке за Universal Link у CDN-у и проверу да фајл није блокиран од стране 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 прослеђује линк апликацији. Обрада се врши у AppDelegate-у кроз метод application(_:continue:restorationHandler:) за NSUserActivity или у SceneDelegate-у кроз scene(_:continue:). Програмер добија NSUserActivity објекат са типом NSUserActivityTypeBrowsingWeb, извлачи URL и навигира на одговарајући екран.
// Обрада Universal Link-а у AppDelegate-у
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). Важно је обрадити не само покретање у првом плану (foreground), већ и случај када апликација није покренута (cold start): Universal Link у овом случају отвара апликацију кроз опције покретања.
Ако апликација није инсталирана, iOS аутоматски отвара Universal Link у Safari-ју. Ово је кључна разлика у односу на Custom URL Scheme: корисник не види грешку. Fallback је стандардна веб страница истог домена. Програмер може на овој страници да постави линк ка App Store-у, информације о производу или алтернативни садржај.
Важно: fallback се не може прилагодити на нивоу iOS-а. iOS једноставно отвара URL у Safari-ју. Да бисте приказали различит садржај корисницима са инсталираном и неинсталираном апликацијом, користите Smart App Banner (meta-таг за Safari који предлаже отварање апликације) или JavaScript детекцију инсталације апликације. Apple такође пружа SKAdNetwork за атрибуцију инсталација путем Universal Link-а.
Universal Link и традиционални Deep Link (Custom URL Scheme) решавају исти задатак, али се суштински разликују по архитектури и безбедности. Custom URL Scheme — прилагођени протокол (myapp://) који се региструје у Info.plist-у. Било која апликација може да региструје исту шему (myapp://), а iOS не може да одреди која је „права". Ово се назива URL Scheme hijacking.
Universal Link решава проблем hijacking-а путем верификације домена. Само власник домена може да постави apple-app-site-association на свом серверу, потврђујући везу са конкретним Bundle ID-ом. Две апликације не могу да региструју један Universal Link: ако дође до конфликта, iOS даје приоритет последње инсталираној апликацији или отвара Safari.
Друга разлика: Fallback. Custom URL Scheme нема fallback — ако апликација није инсталирана, прегледач приказује грешку. Universal Link отвара сајт. Јединствени URL значи да се SEO вредност линка чува (линк индексира Google), а корисник са било којим уређајем добија релевантан садржај. Universal Link је еволутивни корак од deep link-а ка unified link-у.
| Карактеристика | Custom URL Scheme | Universal Link |
|---|---|---|
| Формат | myapp://path | https://domain/path |
| Верификација | Не | apple-app-site-association |
| Безбедност | Рањив на hijacking | Само власник домена |
| Fallback | Грешка | Сајт у Safari-ју |
| iOS верзија | iOS 3+ | iOS 9+ |
Подешавање Universal Link-а укључује серверски и клијентски део. Серверски део — постављање фајла apple-app-site-association на адреси https://domain/.well-known/apple-app-site-association. Клијентски део — регистрација домена у Associated Domains у Xcode-у (Capabilities → Associated Domains → applinks:example.com). Након тога, апликација аутоматски прима све Universal Link-ове за наведени домен.
Кораци подешавања:
Отклањање грешака Universal Link-а — честа главобоља iOS програмера. Главни разлози нерадећих линкова: фајл apple-app-site-association недоступан преко HTTPS-а, нетачан appID, Content-Type није application/json, преусмеравање са /.well-known путање, кеширање старе верзије фајла (ресетовање кроз Settings → Developer → Associated Domains Development). Apple пружа алат „Validation Checker" у Apple Developer Console-и за тестирање асоцијације.
Branch и друге MMP платформе поједностављују подешавање Universal Link-а: оне генеришу apple-app-site-association аутоматски и хостовање га на свом домену. Програмеру је довољно да дода Branch домен у Associated Domains и интегрише 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 као fallback за старе уређаје, ако публика укључује кориснике са застарелим верзијама.
iOS 16+ промене: Apple је побољшао обраду Universal Link-а за SwiftUI. Појавио се нови модификатор environment(\.openURL) са могућношћу одложене обраде. iOS 16 такође омогућава отварање Universal Link-а у апликацији чак и путем SFSafariViewController-а. За кориснике 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. Важно: без преусмеравања, фајл мора бити директно доступан.
Главни разлози: нетачан Team ID или Bundle ID у AASA фајлу, фајл недоступан преко HTTPS-а, преусмеравање, нетачан Content-Type, кеширање старе верзије. Проверите кроз Developer → Associated Domains Development и ресетујте кеш поновним покретањем уређаја.
Не — Universal Link захтева HTTPS сервер на коме је постављен apple-app-site-association. Без домена Universal Link не ради. Алтернатива: Custom URL Scheme (мање безбедно) или услуге трећих страна (Branch, Firebase) са сопственим доменом.
Не — Universal Link је ексклузивна Apple технологија за iOS, iPadOS, watchOS и macOS. На Android-у аналог се зове App Link (Android 6.0+), који користи Digital Asset Links (assetlinks.json) уместо apple-app-site-association.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође