Universal Link — шта је то, принцип рада и подешавање

Аутор: IT Sectr Објављено: 2026-05-14 Време читања: 9 мин

Universal Link је Apple механизам (iOS 9+) који омогућава отварање веб линкова директно у апликацији, заобилазећи Safari. Ако апликација није инсталирана, линк се беспрекорно отвара у прегледачу. Термин је увео Apple 2015. године на WWDC-у као део Handoff-а и Continuity екосистема. Према Apple Developer-у, Universal Link обезбеђује јединствено корисничко искуство између веба и нативне апликације без дијалога за избор.

Главне тачке

  • Universal Link — стандардни хттпс линк који отвара апликацију (iOS 9+) или сајт (fallback)
  • apple-app-site-association — JSON фајл на серверу који потврђује везу домена са апликацијом
  • Безбедност — само власник домена може да асоцира линкове, искључујући пресретање шема
  • Јединствени URL — један линк ради и као веб страница и као улаз у апликацију
  • Handoff и Spotlight — Universal Link се интегрише са Apple претрагом и преносом између уређаја

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. Погледајмо сваку фазу детаљно.

Провера асоцијације (Association Verification)

При првом клику на линк, 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.

json
// 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-ју.

Обрада линка (Link Handling)

Након успешне верификације асоцијације, iOS прослеђује линк апликацији. Обрада се врши у AppDelegate-у кроз метод application(_:continue:restorationHandler:) за NSUserActivity или у SceneDelegate-у кроз scene(_:continue:). Програмер добија NSUserActivity објекат са типом NSUserActivityTypeBrowsingWeb, извлачи URL и навигира на одговарајући екран.

swift
// Обрада 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 у овом случају отвара апликацију кроз опције покретања.

Fallback у прегледач (Browser Fallback)

Ако апликација није инсталирана, 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 SchemeUniversal Link
Форматmyapp://pathhttps://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-ове за наведени домен.

Кораци подешавања:

  1. Направите apple-app-site-association са исправним appID (TeamID.BundleID) и paths
  2. Поставите фајл на сервер на путањи /.well-known/ без екстензије .json
  3. Проверите доступност: curl https://domain/.well-known/apple-app-site-association
  4. Додајте домен у Associated Domains (Xcode Capabilities)
  5. Имплементирајте обраду кроз NSUserActivity (AppDelegate или SceneDelegate)
  6. Тестирајте на стварном уређају (симулатор не проверава асоцијацију)

Отклањање грешака 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 разликује од Custom URL Scheme?

Universal Link користи стандардни HTTPS-URL и верификује се путем фајла на серверу. Custom URL Scheme користи прилагођени протокол (myapp://) без верификације, што га чини рањивим на пресретање од стране друге апликације која је регистровала исту шему.

Где поставити apple-app-site-association?

Фајл се поставља у корен HTTPS сервера на путањи /.well-known/apple-app-site-association (без екстензије .json). Сервер мора да враћа Content-Type: application/json. Важно: без преусмеравања, фајл мора бити директно доступан.

Зашто Universal Link не отвара апликацију?

Главни разлози: нетачан Team ID или Bundle ID у AASA фајлу, фајл недоступан преко HTTPS-а, преусмеравање, нетачан Content-Type, кеширање старе верзије. Проверите кроз Developer → Associated Domains Development и ресетујте кеш поновним покретањем уређаја.

Може ли се Universal Link користити без веб сајта?

Не — Universal Link захтева HTTPS сервер на коме је постављен apple-app-site-association. Без домена Universal Link не ради. Алтернатива: Custom URL Scheme (мање безбедно) или услуге трећих страна (Branch, Firebase) са сопственим доменом.

Да ли Universal Link ради на Android-у?

Не — Universal Link је ексклузивна Apple технологија за iOS, iPadOS, watchOS и macOS. На Android-у аналог се зове App Link (Android 6.0+), који користи Digital Asset Links (assetlinks.json) уместо apple-app-site-association.

Закључак

  • Universal Link — https линк који отвара апликацију на iOS 9+ или сајт у Safari-ју као fallback
  • apple-app-site-association — JSON фајл на серверу који верификује везу домена са апликацијом
  • Безбедност — за разлику од Custom URL Scheme, Universal Link је заштићен од пресретања од стране трећих апликација
  • Јединствени URL — један линк ради за кориснике који су и који нису инсталирали апликацију
  • Handoff и Spotlight — Universal Link се интегрише са Apple Continuity екосистемом
  • Подешавање укључује серверски део (AASA фајл) и клијентски део (Associated Domains + NSUserActivity)
  • Тестирање само на стварном уређају — симулатор не проверава асоцијацију домена

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође