URL Scheme este un protocol URI personalizat pe care aplicația mobilă îl înregistrează în sistemul de operare pentru deschiderea prin linkuri de tipul myapp://path. Conform RFC 3986, schema URI definește sintaxa și semantica tuturor componentelor ulterioare ale adresei. La accesarea unui astfel de link, sistemul identifică aplicația înregistrată după un identificator unic și o lansează cu parametrii extrași din link. Deep link bazat pe URL Scheme rămâne mecanismul de bază al navigării inter-aplicații pe platformele mobile, în ciuda apariției unor alternative mai moderne.
Principalele puncte
URL Scheme — este un identificator unic de protocol pe care aplicația îl înregistrează în sistemul de operare pentru a primi apeluri prin linkuri personalizate. Când utilizatorul face clic pe un link de tipul myapp://profile/123, sistemul identifică aplicația care a înregistrat schema myapp și îi transmite controlul cu URI-ul complet. Acest mecanism permite aplicațiilor să facă schimb de date și să se deschidă reciproc fără infrastructură server.
Conceptul de URL Scheme este preluat direct din standardele web RFC 3986, unde schema URI este prima componentă a oricărui identificator universal de resursă. În dezvoltarea mobilă, această idee a fost adaptată pentru comunicarea între aplicații, unde în locul serverului HTTP acționează însăși aplicația care procesează linkul.
Multe aplicații populare își înregistrează propriile URL Scheme pentru integrarea cu servicii terțe. De exemplu, Spotify utilizează schema spotify://, Telegram — tg://, iar Instagram — instagram://. Dezvoltatorii creează adesea și schema de tipul appname:// pentru navigarea internă și testarea ecranelor.
URL Scheme-urile sunt încă utilizate pe scară largă în notificările push, campaniile email și codurile QR, unde este necesară o tranziție imediată către o secțiune specifică a aplicației. Cu toate acestea, începând cu iOS 9 și Android 6, au apărut mecanisme alternative care completează și înlocuiesc treptat schemele simple.
Structura unui URI personalizat respectă specificația generală RFC 3986 și constă din mai multe componente. Schema este specificată prima și este separată de două puncte de restul adresei. După schemă pot urma host, port, cale, parametrii query și fragment, fiecare fiind opțional.
Sintaxa completă arată ca scheme://host/path?key=value#fragment. Schema este singurul element obligatoriu, restul fiind determinate de necesitățile implementării concrete. Dubla bară oblică după schemă provine istoric din HTTP și nu este strict obligatorie conform specificației, dar este utilizată universal ca convenție.
Pentru reprezentarea vizuală a structurii URI se utilizează un tabel cu componente. Fiecare element are propriul scop și nivel de obligativitate.
| Componentă | Exemplu | Obligativitate |
|---|---|---|
| Scheme | myapp | Da |
| Host | profile | Nu |
| Path | /user/42 | Nu |
| Query | ?id=42&tab=main | Nu |
| Fragment | #section2 | Nu |
Dezvoltatorii pot alege liber structura URI, ceea ce oferă flexibilitate, dar generează probleme de compatibilitate între diferite versiuni ale aplicației. Se recomandă documentarea formatului URL Scheme ca parte a API-ului public al aplicației și versionarea acestuia la modificare.
iOS necesită înregistrarea explicită a fiecărui URL Scheme în fișierul Info.plist al proiectului. Dezvoltatorul adaugă un array CFBundleURLTypes, fiecare element conținând un identificator (CFBundleURLName) și lista schemelor suportate (CFBundleURLSchemes). După înregistrare, sistemul direcționează automat toate apelurile primite către schemele înregistrate către aplicație.
Procesarea URL Scheme-ului primit are loc în delegatul aplicației prin metoda application(_:open:options:). Această metodă primește un obiect URL din care se extrag calea și parametrii query pentru a lua o decizie de navigare. Procesarea trebuie să returneze o valoare Bool care indică succesul operațiunii.
Mai jos este prezentat un exemplu de implementare a unui handler URL Scheme în limbajul Swift. Codul demonstrează extragerea hostului și a parametrilor query din URI-ul primit folosind 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 utilizează URLComponents pentru parsarea sigură a parametrilor query. Această abordare este preferabilă analizei manuale a șirului, deoarece gestionează automat codificarea procentuală și decodificarea caracterelor speciale în valorile parametrilor.
Android utilizează sistemul Intent Filter pentru rutarea deep link-urilor pe baza URL Scheme. Dezvoltatorul declară filtrul în AndroidManifest.xml în interiorul tagului Activity care trebuie să proceseze linkul. Filtrul conține action VIEW, categoriile BROWSABLE și DEFAULT, precum și tagul data cu specificarea schemei, hostului și pathPrefix.
Când utilizatorul face clic pe un link cu o schemă personalizată, sistemul verifică Intent Filter-urile tuturor aplicațiilor instalate. Dacă sunt găsite mai multe aplicații potrivite, utilizatorului i se afișează un dialog de selecție. Categoria BROWSABLE permite procesarea linkului din browser.
Exemplu de declarare a Intent Filter în AndroidManifest.xml pentru procesarea schemei myapp pe o Activity. Combinația dintre action și category este obligatorie pentru rutarea corectă a deep link-ului.
<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>
După configurarea filtrului, în Activity trebuie apelat intent.getData() pentru a obține URI-ul. Este important să verificați intent și datele pentru null, deoarece Activity poate fi lansată fără un deep link primit, de exemplu la pornirea standard din lansator.
Parametrii query în URL Scheme sunt transmiși după semnul întrebării în formatul cheie=valoare, separați prin ampersand. Acest format este identic cu cererile HTTP și este ușor procesat de instrumentele standard ale platformei. Parametrii trebuie codificați folosind codificarea procentuală pentru toate caracterele care nu fac parte din setul permis de URI.
Exemplu de link complet cu parametri: myapp://profile?userId=42&source=email&ref=abc123. După extragerea URL-ului, aplicația parsează secvențial toate query-items și pe baza valorilor lor ia o decizie de navigare către ecranul țintă.
La transmiterea datelor compuse este important să se țină cont de limitarea lungimii URI. În iOS, lungimea maximă a URL Scheme este limitată la 2 KB, după care sistemul trunchiază linkul. În Android, limita este de aproximativ 8 KB, dar valoarea exactă depinde de versiunea sistemului de operare și de producătorul dispozitivului. Pentru volume mari de date, se recomandă transmiterea doar a identificatorului de sesiune prin URL Scheme, iar restul datelor să fie încărcate de pe server.
Principalul dezavantaj al URL Scheme — imposibilitatea de a procesa linkul dacă aplicația nu este instalată pe dispozitiv. Browserul afișează o eroare, iar utilizatorul pierde contextul tranziției. Pentru a rezolva această problemă, Apple a introdus Universal Links în iOS 9, iar Google — App Links în Android 6. Ambele mecanisme se înregistrează printr-un domeniu web asociat aplicației.
Universal Links și App Links funcționează ca linkurile HTTPS obișnuite, dar în prezența aplicației o deschid fără dialog de selecție. Dacă aplicația nu este instalată, linkul deschide o pagină web pe același domeniu, păstrând experiența utilizatorului. Acest lucru le face alternativa preferată pentru mediul de producție.
Pentru URL Scheme pe iOS și Android nu există un mecanism de fallback încorporat. Dezvoltatorii utilizează soluții intermediare pe server: linkul duce către o pagină web care verifică instalarea aplicației prin JavaScript și redirecționează fie către schemă, fie către magazinul de aplicații. Firebase Dynamic Links și Branch.io oferă soluții gata făcute pentru această problemă cu suport pentru deferred deep link, care determină automat starea instalării și direcționează utilizatorul fără a fi nevoie să dezvolte propriul pipeline server.
O complexitate suplimentară apare la utilizarea URL Scheme în iOS 15+ și Android 12+, unde regulile de confidențialitate au fost înăsprite. Safari blochează încercările de a deschide o schemă neînregistrată fără confirmare prealabilă, iar Android 12 limitează vizibilitatea aplicațiilor instalate prin PackageManager. Aceste modificări fac utilizarea URL Scheme pentru interacțiunea între aplicații mai puțin fiabilă decât în versiunile anterioare ale platformelor.
Întrebări frecvente
URL Scheme utilizează un protocol personalizat fără criptare, iar Universal Links funcționează prin HTTPS cu verificarea domeniului. Universal Links nu afișează dialogul de selecție a aplicației și sunt procesate corect în absența aplicației pe dispozitiv.
Da, dar toate caracterele non-ASCII trebuie codificate prin percent-encoding conform RFC 3986. Se recomandă evitarea chirilicei în URL Scheme pentru a asigura compatibilitatea cu versiunile vechi ale sistemelor de operare și browserelor.
Nu există limitări privind numărul de scheme nici în iOS, nici în Android. În practică, aplicațiile utilizează de la una la cinci scheme. De exemplu, Telegram înregistrează schemele tg://, t.me/, telegram:// și telegram.me://.
În iOS se utilizează metoda canOpenURL(_:), care returnează true în prezența unei scheme înregistrate. În Android, verificarea se realizează prin PackageManager.queryIntentActivities(). Ambele platforme necesită specificarea prealabilă a schemei în configurație.
Nu, URL Scheme nu criptează datele. Orice aplicație care a înregistrat aceeași schemă poate intercepta linkul. Pentru securitate, utilizați Universal Links cu HTTPS sau criptarea datelor la nivel de protocol.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și