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

Deep Linking Universal cu Expo Router: De la Custom Schemes la Universal Links

De Alexandru Matei, 27 mai 2026 · 4 vizualizări · 3 like-uri

Postat 27 mai 2026
json
{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "scheme": "myapp",
    "ios": {
      "bundleIdentifier": "com.customdomain.myapp",
      "associatedDomains": ["applinks:app.customdomain.ro"]
    },
    "android": {
      "package": "com.customdomain.myapp",
      "intentFilters": [
        {
          "action": "VIEW",
          "autoVerify": true,
          "data": [
            { "scheme": "https", "host": "app.customdomain.ro", "pathPrefix": "/" },
            { "scheme": "http", "host": "app.customdomain.ro", "pathPrefix": "/" }
          ],
          "category": ["BROWSABLE", "DEFAULT"]
        }
      ]
    }
  }
}

Salutare! Dacă ai de implementat deep linking universal în Expo Router, probabil ai observat deja că documentația oficială face totul să pară o joacă de copii. Realitatea? Te lovești repede de configurări native ascunse și de caching-ul agresiv al Apple.

Am avut recent de implementat asta pentru o aplicație de e-commerce cu peste 15.000 de utilizatori activi. Am pierdut vreo trei zile doar ca să înțeleg de ce pe Android mergea instant, iar pe iOS îmi deschidea Safari în loc de aplicație. Iată cum am rezolvat-o și ce trebuie să ai în vedere ca să nu-ți prinzi urechile.

De ce nu sunt de ajuns schemele custom?

Cea mai simplă metodă e să pui o schemă custom în app.json, gen my-app://. Merge brici la testare locală. Dar în producție, schema asta are o mare problemă de securitate: oricine își poate compila o aplicație cu aceeași schemă și îți poate intercepta link-urile.

De aceea avem nevoie de Universal Links (iOS) și App Links (Android). Ele folosesc un domeniu web real (cum ar fi app.customdomain.ro) pe care îl deții și pe care îl asociezi cu aplicația ta prin fișiere de verificare găzduite securizat.

Magia din app.json

Expo Router simplifică maparea URL-urilor direct pe structura ta de fișiere din folderul /app. Totuși, trebuie să-i spui sistemului de operare că aplicația ta "ascultă" de acel domeniu direct din faza de build. Toată configurarea pornește din app.json.

Pe iOS, ai nevoie de cheia associatedDomains în interiorul configurării native. Pe Android, trebuie să adaugi intentFilters cu autoVerify setat pe true. Fără acest autoVerify, Android nu va valida automat domeniul tău la instalarea aplicației din Play Store.

Fișierele de verificare: Unde greșește toată lumea

După ce ai configurat aplicația, trebuie să pui pe serverul tău web, în folderul .well-known, două fișiere de asociere. Aici e buba.

Pentru iOS, ai nevoie de apple-app-site-association (fără extensia .json în URL!). Pe Android, ai nevoie de assetlinks.json.

Am pățit ca serverul Nginx să returneze fișierul de iOS ca text/plain sau, mai rău, cu status 404 din cauza unei reguli greșite de rutare. iOS cere neapărat ca tipul de conținut (Content-Type) să fie application/json sau să nu aibă deloc tip, iar serverul să returneze status 200. Dacă ai Cloudflare activat, asigură-te că nu blochează request-urile venite de la boții Apple sau Google care verifică aceste fișiere.

Trade-off-uri și debugging în producție

Expo Router face o treabă excelentă pentru că mapează URL-ul https://app.customdomain.ro/produs/123 direct pe ruta app/produs/[id].tsx. Nu mai trebuie să scrii tu manual parsere de URL-uri în Linking.js cum făceam pe vremuri în React Navigation clasic. Am economisit cam 30% din codul de navigare datorită acestei mapări automate.

Dar există și un revers al medaliei. Debugging-ul pe iOS este un coșmar din cauza CDN-ului Apple. Când instalezi aplicația, iOS nu citește fișierul direct de pe site-ul tău, ci din cache-ul lor. Dacă ai greșit un caracter în AASA, trebuie să schimbi bundle identifier-ul sau să aștepți până la 24 de ore ca Apple să-și actualizeze cache-ul. Sfatul meu: folosește modul de developer pe iOS (Associated Domains Development Mode) în timpul testelor ca să forțezi bypass-ul CDN-ului.

Voi cum testați deep link-urile în faza de development? Folosiți direct CLI-ul de la Expo sau preferați să trimiteți comenzi adb / xcrun direct în terminal?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

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