eduardweb.
Navigație & StateAvansat#react-native#android#ios#deep-linking#expo-router

Deep linking cu Expo Router: de la Custom Schemes la Universal Links

De Adrian Voicu, 6 aug. 2026 · 7 vizualizări · 3 like-uri

Postat 6 aug. 2026
json
{
  "expo": {
    "name": "MyApp",
    "slug": "my-app",
    "scheme": "myapp",
    "ios": {
      "supportsTablet": true,
      "bundleIdentifier": "ro.domeniu.myapp",
      "associatedDomains": ["applinks:app.domeniu.ro"]
    },
    "android": {
      "package": "ro.domeniu.myapp",
      "intentFilters": [
        {
          "action": "VIEW",
          "autoVerify": true,
          "data": [
            {
              "scheme": "https",
              "host": "app.domeniu.ro",
              "pathPrefix": "/"
            }
          ],
          "category": ["DEFAULT", "BROWSABLE"]
        }
      ]
    }
  }
}

Am configurat recent tot flow-ul de deep linking pe un proiect în producție cu peste 40k useri activi unde am trecut de la vechiul React Navigation la Expo Router v3. Cine a făcut asta manual în trecut știe ce calvar era să ții în sinergie linking.config.ts, state-ul navigării și rutele din URL.

Expo Router simplifică dramatic procesul fiindcă folosește file-based routing. Practic, structura ta din app/ devine automat harta URL-urilor. Totuși, dracul se ascunde în detalii când treci de la simple scheme-uri de dev (myapp://) la Universal Links (iOS) și App Links (Android).

Custom Scheme vs Universal Links: unde apar problemele

Custom schemes (myapp://product/123) sunt excelente pentru mediul de dezvoltare sau integrări simple (de exemplu un callback de OAuth). Se setează în două minute. Problema? Nu sunt unice. Orice altă aplicație instalată pe telefon poate înregistra același scheme și îți poate 'fura' traficul sau mai rău, date senzitive.

Universal Links (iOS) și App Links (Android) rezolvă asta prin verificare domeniului. Telefonul verifică cryptographic dacă domeniul app.domeniu.ro chiar aprobă aplicația ta nativă.

Am observat o scădere de 14% în drop-off-ul din campaniile de email marketing imediat ce am trecut complet pe Universal Links. Utilizatorul nu mai vede acel pop-up enervant de confirmare din browser, ci intră direct în ecranele din app.

Setup-ul în Expo: app.json

Ca să meargă totul curat, ai nevoie de configurare pe ambele platforme. În app.json, pe lângă câmpul scheme, trebuie să declari domeniile asociate pentru iOS și filtrele de intenție pentru Android.

Un detaliu peste care mulți trec cu vederea: pe Android, autoVerify: true este critic. Fără el, sistemul de operare nu va încerca să descarce fișierul assetlinks.json de pe serverul tău la instalarea aplicației și va deschide link-ul în browser.

Configurația de pe server (AASA și assetlinks.json)

Aici se blochează majoritatea devilor. Apple și Google au cerințe stricte pentru fișierele de verificare hostate pe domeniul tău:

  1. iOS (/.well-known/apple-app-site-association): Trebuie servit obligatoriu peste HTTPS, fără redirect-uri (status 200 direct) și FĂRĂ extensia .json în URL. Content-Type-ul trebuie să fie application/json.
  2. Android (/.well-known/assetlinks.json): Are nevoie de SHA-256 fingerprint-ul certificatului tău de build. Atenție mare aici: dacă folosești App Signing by Google Play, trebuie să pui fingerprint-ul generat de Google, NU pe cel local de debug sau release din mașina ta.

Trade-off-uri și edge cases

Sistemul funcționează impecabil când aplicația e deja în background. În schimb, pe cold start (când aplicația e închisă complet și userul apasă pe link), mai apar întârzieri de 200-300ms până când Expo Router hidratează rutele și parsează parametrii dinamici din app/[category]/[id].tsx.

De asemenea, testarea pe iOS Simulator e înșelătoare. Universal Links NU funcționează dacă lipsești link-ul direct în bara Safari. Trebuie să îl trimiți într-o notiță în aplicația Notes sau să folosești CLI-ul Expo pentru simulare.

Voi ce soluție folosiți pentru fallback când utilizatorul dă click pe link dar nu are aplicația instalată? Mergeți pe redirecționare din Nginx către App Store sau aveți un landing page dedicat?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.