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

Cum configurezi corect Deep Linking Universal în Expo Router (fără să o iei razna)

De Paul Ene, 21 iul. 2026 · 11 vizualizări · 2 like-uri

Postat 21 iul. 2026
json
{
  "expo": {
    "scheme": "myapp",
    "ios": {
      "bundleIdentifier": "com.company.myapp",
      "associatedDomains": ["applinks:myapp.com"]
    },
    "android": {
      "package": "com.company.myapp",
      "intentFilters": [
        {
          "action": "VIEW",
          "autoVerify": true,
          "data": [
            { "scheme": "https", "host": "myapp.com", "pathPrefix": "/" }
          ],
          "category": ["BROWSABLE", "DEFAULT"]
        }
      ]
    }
  }
}

Să fim sinceri, deep linking-ul e una dintre cele mai enervante chestii de configurat în mobile. Am pățit-o recent pe un proiect cu 15.000 de useri activi unde aveam nevoie ca link-urile de share trimise pe WhatsApp să deschidă direct ecranul de detalii din app, nu browserul. Cu Expo Router e mult mai simplu ca pe vremuri, dar tot ai câteva mine pe care poți să calci ușor.

Dacă vrei doar să deschizi aplicația dintr-un mail de confirmare, un custom scheme (myapp://) e de ajuns și se configurează în 2 minute. Dacă vrei însă "Universal Links" (iOS) și "App Links" (Android) — adică link-uri de tipul https://mywebsite.com/produs/123 care să deschidă direct aplicația dacă e instalată, sau site-ul dacă nu e — atunci începe distracția.

Configurația din app.json (Partea de Expo)

În loc să scriem cod nativ în Xcode sau Android Studio, Expo se ocupă de generarea fișierelor prin Prebuild. Tot ce trebuie să facem e să completăm corect app.json.

Pentru iOS, ai nevoie de associatedDomains în formatul applinks:domeniul-tau.ro. Pentru Android, ai nevoie de un intentFilter cu autoVerify: true și maparea pe host-ul tău.

Trade-off sincer: Schema asta merge perfect doar pe build-uri de tip Development Client sau Release. În Expo Go, Universal Links nu vor funcționa nativ pe iOS din cauza limitărilor de sandbox de la Apple. Trebuie să îți faci build local (sau prin EAS) ca să testezi cum trebuie.

Fișierele de pe server (AASA și Assetlinks)

Aici se blochează 80% dintre developeri. Ca sistemul de operare să aibă încredere că tu deții site-ul mywebsite.com, trebuie să pui niște fișiere JSON pe serverul tău, sub folderul .well-known/.

Pentru iOS: .well-known/apple-app-site-association (atenție, fără extensia .json!). Pentru Android: .well-known/assetlinks.json.

La proiectul de care ziceam, am pierdut vreo 4 ore pentru că serverul nostru de Nginx dădea un header Content-Type: text/plain în loc de application/json pentru fișierul de iOS. Apple e extrem de strict aici: dacă header-ul nu e corect sau dacă serverul nu folosește HTTPS cu certificat valid (nu self-signed), iOS pur și simplu ignoră asocierea și deschide link-ul în Safari fără niciun warning în consolă.

Pentru Android, ai nevoie de SHA256-ul certificatului cu care semnezi aplicația. Dacă folosești EAS Build, îl iei direct din consola Expo folosind comanda eas credentials. Dacă folosești Google Play App Signing, trebuie să iei SHA-ul din consola Google Play, nu pe cel local, altfel build-ul de producție nu va deschide link-urile.

Cum preiei parametrii în cod

Odată ce configurarea nativă e gata, Expo Router face totul extrem de simplu prin structura de directoare. Dacă un user dă click pe https://mywebsite.com/user/42?ref=forum, Expo Router va mapa automat link-ul pe ruta /user/[id].tsx.

În interiorul ecranului, folosești hook-ul useLocalSearchParams ca să prinzi valorile.

La final, ține minte: Universal Links se bazează pe încredere bidirecțională (aplicația declară domeniul, iar domeniul confirmă aplicația). Dacă ceva nu merge, verifică mai întâi CDN-ul (Cloudflare poate bloca request-urile de la Apple bot) și headerele HTTP.

Voi cum testați deep link-urile local? Mergeți pe simulator cu xcrun simctl openurl sau folosiți direct telefoane fizice?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

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