Un Deep Link (link profondo) è un URL che indirizza l'utente a uno schermo o contenuto specifico all'interno di un'applicazione mobile, bypassando la schermata principale. A differenza di un normale link a un sito web, un deep link attiva l'app e apre immediatamente il contenuto target. Secondo Android Developers, i deep link configurati correttamente aumentano la conversione nell'azione target del 30–50% riducendo il numero di passaggi per raggiungere il contenuto.
Punti chiave
Un Deep Link (link profondo) è un URI che, quando viene cliccato, non apre una pagina web ma uno schermo specifico all'interno di un'applicazione mobile. La tecnologia risolve un problema fondamentale delle piattaforme mobili: il browser non può aprire direttamente uno schermo dell'app, e un deep link crea un ponte tra il web e il codice nativo. Senza un deep link, l'utente arriva sempre alla schermata principale ed è costretto a navigare manualmente fino al contenuto desiderato.
L'architettura di un deep link è composta da due parti: lo schema (scheme) determina quale app deve elaborare il link, e il percorso (path) punta a una risorsa specifica all'interno dell'app — un prodotto, un articolo, un profilo utente o una sezione delle impostazioni. I parametri di query (?source=push&campaign=summer) trasmettono contesto aggiuntivo per analisi, personalizzazione e attribuzione delle campagne.
È importante distinguere tra un deep link e un link normale. Un link normale (https://example.com/product/42) si apre nel browser e porta alla versione web di una pagina. Un deep link (myapp://product/42), se l'app è installata, apre lo schermo nativo con lo stesso contenuto, ma se l'app non è installata, mostra un errore. Universal Link (iOS) e App Link (Android) sono stati creati proprio per risolvere il problema del fallback senza soluzione di continuità.
Compiti diversi richiedono tipi diversi di deep link. Alcuni link funzionano solo con l'app installata, altri possono attendere l'installazione, e altri ancora trasmettono contesto analitico. La scelta del tipo dipende dal caso d'uso: campagna pubblicitaria, notifica push, condivisione di contenuti o newsletter via email.
Un Standard Deep Link è il tipo base che si attiva solo se l'app è già installata sul dispositivo. L'utente clicca su un link myapp://product/42, il sistema rileva lo schema registrato e apre l'app sullo schermo desiderato. Se l'app non è installata, il browser mostra un errore “Pagina non trovata” o semplicemente non fa nulla. Questo tipo è adatto per la navigazione interna all'interno di un'app già installata.
Configurare un deep link standard è semplice: basta registrare lo schema URI nel manifest (Android) o Info.plist (iOS). Non è richiesta alcuna validazione del server o certificati SSL. Tuttavia, proprio a causa della mancanza di fallback, questo tipo è considerato obsoleto per le campagne di marketing — la perdita di traffico dagli utenti senza l'app può raggiungere il 60%.
Un Deferred Deep Link risolve il problema principale dei deep link normali: funziona anche se l'app non è installata. L'utente clicca su un link → vede una pagina (pagina di atterraggio o App Store/Google Play) → installa l'app → al primo avvio, l'app riceve il contesto del link originale e apre lo schermo desiderato. La tecnologia richiede un SDK intermediario (AppsFlyer, Branch, Adjust) che memorizza il contesto sul server fino al primo avvio.
Branch è una delle piattaforme più popolari per i deferred deep link. Fornisce un unico link che funziona su tutte le piattaforme: rileva il sistema operativo dell'utente, reindirizza all'app store e, dopo l'installazione, trasmette il contesto (codice promozionale, ID prodotto, fonte della campagna). Secondo Branch (2024), i deferred deep link aumentano la conversione delle campagne pubblicitarie del 40–70%.
Un Contextual Deep Link è un deep link normale o differito integrato con parametri di contesto: fonte di traffico, campagna, codice promozionale, referrer, ID partner. I parametri vengono trasmessi nell'URL e elaborati dall'app per la personalizzazione: mostrare un bonus di benvenuto, aprire un prodotto con sconto, registrare analisi di installazione.
I tag UTM (utm_source, utm_medium, utm_campaign) sono un modo standard per trasmettere il contesto. Nel mobile, i deep link contestuali sono fondamentali per l'attribuzione: senza di essi, il proprietario dell'app non sa quale canale ha portato l'utente — traffico organico, annunci Facebook, newsletter via email o codice QR. Un'attribuzione di qualità richiede l'integrazione con un MMP (Mobile Measurement Partner).
| Tipo di Deep Link | Richiede installazione | Attendere installazione | Contesto |
|---|---|---|---|
| Standard | Sì | No | Solo in URL |
| Differito | No | Sì | Archiviazione server |
| Contestuale | Qualsiasi | Qualsiasi | UTM + parametri |
iOS supporta i deep link attraverso due meccanismi: il vecchio Custom URL Scheme e il moderno Universal Link (iOS 9+). Custom URL Scheme funziona registrando uno schema personalizzato in Info.plist. L'app registra myapp:// e iOS apre l'app quando si clicca su tale link. Il problema: se lo schema non è registrato da nessuna app, il browser mostra un errore.
La gestione dei deep link su iOS avviene tramite il metodo AppDelegate application(_:open:options:) o SceneDelegate scene(_:openURLContexts:). Lo sviluppatore estrae l'URL, analizza il percorso e i parametri, quindi naviga verso lo schermo appropriato. Se si utilizza SwiftUI, la gestione avviene tramite OpenURLAction o onChange(of: openURL). È importante gestire correttamente lo stato dell'app: l'app può essere non avviata, in background o attiva.
La sicurezza su iOS è rigorosa: qualsiasi app può intercettare un Custom URL Scheme registrando lo stesso schema. Questa è una potenziale vulnerabilità (dirottamento dello schema URL). Pertanto, Apple raccomanda Universal Link come alternativa più sicura: solo il proprietario verificato del dominio può associare link all'app. Ulteriori informazioni su Universal Link nell'articolo Universal Link.
Android implementa i deep link tramite Intent Filter in AndroidManifest.xml. L'app definisce un'Activity che gestisce uno schema specifico (myapp://) o host e percorsi specifici. Quando l'utente clicca su un deep link, Android cerca un'Activity con un Intent Filter corrispondente e la apre. Se ci sono più Activity corrispondenti, il sistema mostra un dialogo di selezione dell'app.
// AndroidManifest.xml - Intent Filter per Deep Link
<activity
android:name=".ui.ProductActivity"
android:exported="true">
<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="product"
android:pathPrefix="/" />
</intent-filter>
</activity>
La gestione dei deep link su Android viene eseguita nel metodo Activity.onCreate() o onNewIntent(). Lo sviluppatore riceve l'Intent, estrae l'URI ed esegue la navigazione. Per Jetpack Navigation, il componente Navigation Deep Link consente di descrivere dichiarativamente i deep link nel grafico di navigazione. Android App Link (Android 6.0+) è un'evoluzione dei deep link con verifica tramite Digital Asset Links, eliminando il dialogo di selezione dell'app.
È importante considerare le modifiche di Android 12+: a partire dall'API 31, il sistema richiede la dichiarazione esplicita di exported=true per le Activity che gestiscono i deep link e verifica la correttezza dell'Intent Filter. Google Play Store verifica la convalida dell'App Link durante la pubblicazione. Senza verifica, Google potrebbe rifiutare l'aggiornamento se i deep link portano a pagine inesistenti del sito web.
La configurazione dei deep link include diverse fasi comuni a entrambe le piattaforme. Il primo passo è definire lo schema e la struttura dell'URL. Si consiglia di utilizzare lo schema https (invece di uno personalizzato) per la compatibilità con Universal Link e App Link. La struttura dell'URL dovrebbe rispecchiare la struttura del sito web: /product/42, /profile/john, /settings/notifications. Ciò semplifica la manutenzione e l'indicizzazione dei contenuti da parte dei motori di ricerca.
La seconda fase è la gestione dei deep link nel codice dell'app. Per Android, si consiglia Jetpack Navigation con deep link dichiarativi in nav_graph. Per iOS — SwiftUI NavigationStack con gestione OpenURLAction. È importante gestire tre stati dell'app: avvio a freddo (app non avviata), avvio a caldo (in background) e attivo (a schermo). Ogni stato richiede una logica di navigazione diversa.
Il test dei deep link è un compito separato. Android Studio fornisce lo strumento App Links Assistant per verificare gli Intent Filter. Su iOS, il test viene eseguito tramite Xcode passando un URL tramite argomenti dello schema di avvio. Si consiglia di impostare un controllo CI: navigazione automatica tramite deep link e verifica che si sia aperto lo schermo previsto. Per i deferred deep link, il test include il ciclo completo di “installazione → primo avvio → contesto”. Senza test, i deep link spesso si rompono quando viene aggiornata la navigazione nell'app.
Domande frequenti
Un link normale (https://site.com/page) si apre nel browser. Un deep link (myapp://page o https://site.com/page con verifica) apre uno schermo all'interno di un'app mobile. Un deep link può anche trasmettere contesto: codice promozionale, fonte di traffico, ID referrer.
Uno schema URI è un prefisso URL che determina quale app deve elaborare il link (esempio: myapp://, vk://, tg://). Il sistema utilizza lo schema per il routing: trova l'app che ha registrato questo schema e le passa l'URL per l'elaborazione.
L'utente clicca su un link → il servizio (Branch, AppsFlyer) memorizza il contesto → reindirizza all'App Store/Google Play → dopo l'installazione e il primo avvio, l'SDK passa il contesto salvato all'app → l'app apre lo schermo desiderato, come se l'utente avesse già l'app installata.
Un deep link normale — no. Un deferred deep link — sì, tramite una pagina intermedia che reindirizza all'app store e salva il contesto. Universal Link e App Link aprono il sito web come fallback se l'app non è installata.
Su Android, usa adb: adb shell am start -W -a android.intent.action.VIEW -d “myapp://product/42”. Su iOS — xcrun simctl openurl booted “myapp://product/42”. Le console di test di Firebase Dynamic Links e Branch sono disponibili per entrambe le piattaforme.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche