URL Scheme je vlastní URI protokol, který mobilní aplikace registruje v operačním systému pro otevírání pomocí odkazů ve tvaru myapp://path. Podle RFC 3986 schéma URI definuje syntaxi a sémantiku všech následujících komponent adresy. Při kliknutí na takový odkaz systém identifikuje registrovanou aplikaci podle unikátního identifikátoru a spustí ji s parametry extrahovanými z odkazu. Deep link založený na URL Scheme zůstává základním mechanismem navigace mezi aplikacemi na mobilních platformách, navzdory vzniku modernějších alternativ.
Hlavní body
URL Scheme — je unikátní identifikátor protokolu, který aplikace registruje v operačním systému pro příjem volání prostřednictvím vlastních odkazů. Když uživatel klikne na odkaz jako myapp://profile/123, systém identifikuje aplikaci, která zaregistrovala schéma myapp, a předá jí řízení s úplným URI. Tento mechanismus umožňuje aplikacím vyměňovat si data a otevírat se navzájem bez serverové infrastruktury.
Koncept URL Scheme je přímo převzat z webových standardů RFC 3986, kde schéma URI je první komponentou každého univerzálního identifikátoru zdroje. V mobilním vývoji byla tato myšlenka adaptována pro komunikaci mezi aplikacemi, kde místo HTTP serveru vystupuje sama aplikace zpracovávající odkaz.
Mnoho populárních aplikací registruje vlastní URL Scheme pro integraci s externími službami. Například Spotify používá schéma spotify://, Telegram — tg:// a Instagram — instagram://. Vývojáři také často vytvářejí schéma ve tvaru appname:// pro interní navigaci a testování obrazovek.
URL Scheme jsou stále široce používány v push notifikacích, e-mailových kampaních a QR kódech, kde je vyžadován okamžitý přechod do konkrétní sekce aplikace. Od iOS 9 a Android 6 se však objevily alternativní mechanismy, které postupně doplňují a nahrazují holá schémata.
Struktura vlastního URI podléhá obecné specifikaci RFC 3986 a skládá se z několika komponent. Schéma se uvádí jako první a je odděleno dvojtečkou od zbytku adresy. Po schématu mohou následovat host, port, cesta, query parametry a fragment, z nichž každý je volitelný.
Úplná syntaxe vypadá jako scheme://host/path?key=value#fragment. Schéma je jediným povinným prvkem, ostatní jsou určeny potřebami konkrétní implementace. Dvojité lomítko za schématem historicky pochází z HTTP a není podle specifikace striktně povinné, ale všude se používá jako konvence.
Pro vizuální znázornění struktury URI se používá tabulka komponent. Každý prvek má svůj účel a úroveň povinnosti.
| Komponenta | Příklad | Povinnost |
|---|---|---|
| Scheme | myapp | Ano |
| Host | profile | Ne |
| Path | /user/42 | Ne |
| Query | ?id=42&tab=main | Ne |
| Fragment | #section2 | Ne |
Vývojáři mohou volně zvolit strukturu URI, což poskytuje flexibilitu, ale vytváří problémy s kompatibilitou mezi různými verzemi aplikace. Doporučuje se dokumentovat formát URL Scheme jako součást veřejného API aplikace a verzovat jej při změně.
iOS vyžaduje explicitní registraci každého URL Scheme v souboru Info.plist projektu. Vývojář přidá pole CFBundleURLTypes, jehož každý prvek obsahuje identifikátor (CFBundleURLName) a seznam podporovaných schémat (CFBundleURLSchemes). Po registraci systém automaticky směruje všechna příchozí volání na registrovaná schémata do aplikace.
Zpracování příchozího URL Scheme probíhá v delegátu aplikace prostřednictvím metody application(_:open:options:). Tato metoda obdrží objekt URL, z něhož se extrahuje cesta a query parametry pro rozhodnutí o navigaci. Zpracování musí vrátit hodnotu Bool indikující úspěšnost operace.
Níže je uveden příklad implementace obsluhy URL Scheme v jazyce Swift. Kód demonstruje extrakci hosta a query parametrů z příchozího URI pomocí URLComponents.
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
let host = url.host
let params = URLComponents(
url: url,
resolvingAgainstBaseURL: false
)?.queryItems
if host == "profile" {
navigateToProfile(params)
}
return true
}
Metoda používá URLComponents pro bezpečné parsování query parametrů. Tento přístup je preferován před ručním zpracováním řetězce, protože automaticky zvládá procentuální kódování a dekódování speciálních znaků v hodnotách parametrů.
Android používá systém Intent Filter pro směrování deep link na základě URL Scheme. Vývojář deklaruje filtr v AndroidManifest.xml uvnitř tagu Activity, která má odkaz zpracovávat. Filtr obsahuje action VIEW, kategorie BROWSABLE a DEFAULT a tag data s uvedením schématu, hosta a pathPrefix.
Když uživatel klikne na odkaz s vlastním schématem, systém zkontroluje Intent Filter všech nainstalovaných aplikací. Pokud je nalezeno několik vhodných aplikací, uživateli se zobrazí dialog výběru. Kategorie BROWSABLE umožňuje zpracování odkazu z prohlížeče.
Příklad deklarace Intent Filter v AndroidManifest.xml pro zpracování schématu myapp na Activity. Kombinace action a category je povinná pro správné směrování deep link.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile"
android:pathPrefix="/user" />
</intent-filter>
</activity>
Po nastavení filtru je v Activity nutné zavolat intent.getData() pro získání URI. Je důležité zkontrolovat intent a data na null, protože Activity může být spuštěna bez příchozího deep link, například při standardním spuštění z launcheru.
Query parametry v URL Scheme se předávají za otazníkem ve formátu klíč=hodnota, oddělené ampersandem. Tento formát je totožný s HTTP požadavky a snadno se zpracovává standardními nástroji platformy. Parametry musí být kódovány pomocí procentuálního kódování pro všechny znaky, které nepatří do povolené sady URI.
Příklad úplného odkazu s parametry: myapp://profile?userId=42&source=email&ref=abc123. Po extrakci URL aplikace sekvenčně parsuje všechny query-items a na základě jejich hodnot rozhoduje o navigaci na cílovou obrazovku.
Při předávání složitých dat je důležité zohlednit omezení délky URI. V iOS je maximální délka URL Scheme omezena na 2 KB, po jejímž překročení systém odkaz zkrátí. V Android je limit přibližně 8 KB, ale přesná hodnota závisí na verzi operačního systému a výrobci zařízení. Pro velké objemy dat se doporučuje předávat pouze identifikátor relace přes URL Scheme a zbývající data načítat ze serveru.
Hlavní nevýhodou URL Scheme — neschopnost zpracovat odkaz, pokud aplikace není nainstalována na zařízení. Prohlížeč zobrazí chybu a uživatel ztratí kontext přechodu. K vyřešení tohoto problému Apple zavedl Universal Links v iOS 9 a Google — App Links v Android 6. Oba mechanismy se registrují pomocí webové domény připojené k aplikaci.
Universal Links a App Links fungují jako běžné HTTPS odkazy, ale při nainstalované aplikaci ji otevírají bez dialogu výběru. Pokud aplikace není nainstalována, odkaz otevře webovou stránku na stejné doméně, čímž zachovává uživatelský zážitek. To z nich činí preferovanou alternativu pro produkční prostředí.
Pro URL Scheme na iOS a Android neexistuje vestavěný mechanismus fallback. Vývojáři používají mezilehlá serverová řešení: odkaz vede na webovou stránku, která kontroluje instalaci aplikace pomocí JavaScript a přesměrovává buď na schéma, nebo do obchodu s aplikacemi. Firebase Dynamic Links a Branch.io nabízejí hotová řešení tohoto problému s podporou deferred deep link, která automaticky určují stav instalace a směrují uživatele bez nutnosti vyvíjet vlastní serverový pipeline.
Další složitost vzniká při použití URL Scheme v iOS 15+ a Android 12+, kde byly zpřísněny pravidla ochrany soukromí. Safari blokuje pokusy o otevření neregistrovaného schématu bez předchozího potvrzení a Android 12 omezuje viditelnost nainstalovaných aplikací přes PackageManager. Tyto změny činí použití URL Scheme pro interakci mezi aplikacemi méně spolehlivým než v dřívějších verzích platforem.
Často kladené otázky
URL Scheme používá vlastní protokol bez šifrování, zatímco Universal Links fungují přes HTTPS s ověřením domény. Universal Links nevyvolávají dialog výběru aplikace a jsou správně zpracovány při absenci aplikace na zařízení.
Ano, ale všechny ne-ASCII znaky musí být kódovány pomocí percent-encoding podle RFC 3986. Doporučuje se vyhýbat se cyrilici v URL Scheme pro zajištění kompatibility se staršími verzemi operačních systémů a prohlížečů.
Neexistují omezení počtu schémat ani v iOS, ani v Android. V praxi aplikace používají jedno až pět schémat. Například Telegram registruje schémata tg://, t.me/, telegram:// a telegram.me://.
V iOS se používá metoda canOpenURL(_:), která vrací true při existenci registrovaného schématu. V Android se kontrola provádí přes PackageManager.queryIntentActivities(). Obě platformy vyžadují předchozí uvedení schématu v konfiguraci.
Ne, URL Scheme nešifruje data. Jakákoli aplikace, která zaregistrovala stejné schéma, může odkaz zachytit. Pro bezpečnost používejte Universal Links s HTTPS nebo šifrování dat na úrovni protokolu.
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é