Conceptos
Deep linking: directo y diferido
Abre la app en la pantalla correcta desde un enlace de Traqio: directo si está instalada, tras la instalación si no. Dominios, archivos de asociación, callback.
Un deep link abre una app en una pantalla concreta en lugar de en su inicio. Un enlace de seguimiento de Traqio lleva un destino opcional — una ruta interna como /product/42, o una URL de app como myapp://product/42 — y el SDK se lo entrega a tu app en dos momentos, a través de un único callback:
| Cuándo | Cómo lo resuelve Traqio | |
|---|---|---|
| Directo | la app está instalada y un enlace la abre | el SDK envía la URL; Traqio devuelve el destino de ese enlace y registra el clic |
| Diferido | el enlace se tocó antes de la instalación | en el primer arranque de la instalación nueva, el SDK pregunta una vez a dónde quería llevar ese enlace |
Deep links directos#
iOS (universal links) y Android (App Links) abren una app en lugar del navegador solo para un dominio que la app declara, y que a su vez declara la app mediante un archivo en el dominio. Por eso los deep links directos necesitan tu propio dominio de seguimiento:
- Configura el dominio de seguimiento de la app en la consola (Ajustes de la app → Dominio de seguimiento).
- En los ajustes de Enlaces de tu app, indica tu Apple Team ID y tu bundle id, y las huellas SHA-256 de tu certificado de firma de Android (Play Console → App integrity → App signing — añade también la de la clave de subida si pruebas fuera de Google Play).
- Traqio sirve
/.well-known/apple-app-site-associationy/.well-known/assetlinks.jsonen tu dominio, generados a partir de esa identidad. - Declara el dominio en la app — la consola muestra ambos fragmentos con tus valores:
applinks:go.example.com<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="go.example.com" android:pathPrefix="/c/" />
</intent-filter>Cuando el sistema abre la app, nunca ha llegado a cargar el enlace, así que el SDK envía la URL a Traqio, que registra el clic que de otro modo se habría perdido y responde con el destino. Solo las URLs con la forma https://<host>/c/<code> salen del dispositivo; las URLs propias de tu app se ignoran sin ninguna petición. Un enlace solo se resuelve para la app a la que pertenece, en el dominio de esa app.
Un dominio por app
/c/ del dominio — sin selector, sin una app que abra el enlace de otra. Dos apps (dos marcas) de un mismo espacio de trabajo configuran dos dominios, por ejemplo go.marca-a.com y go.marca-b.com.Universal links en 2 minutos#
Traqio sirve él mismo los archivos de asociación — apple-app-site-association yassetlinks.json, en tu dominio de marca, generados a partir de la identidad que indicas en la consola. No alojas nada. Solo queda declarar el dominio en la app, por uno de estos tres caminos.
La atribución no necesita nada de esto
(a) Expo con credenciales gestionadas por EAS#
Añade el config plugin @traqio/expo con tu dominio y ejecuta eas build. Añadeapplinks:<dominio> a ios.associatedDomains y el intent filter de App Links de Android, sin duplicar lo que ya declaras.
{
"expo": {
"plugins": [["@traqio/expo", { "domains": ["go.example.com"] }]]
}
}EAS Build sincroniza las capabilities: como el entitlement forma parte del build, activaAssociated Domains en tu App ID del portal Apple Developer por ti (Expo — iOS capabilities). Si desactivaste la sincronización (EXPO_NO_CAPABILITY_SYNC=1) o gestionas el App ID tú mismo, hazlo una vez a mano: Certificates, Identifiers & Profiles → Identifiers → tu bundle id → marca Associated Domains → Save, y regenera los provisioning profiles que lo usan. Sin eso el build falla con “doesn't support the Associated Domains capability”.
(b) iOS nativo, en Xcode#
Target → Signing & Capabilities → + Capability →Associated Domains → añade applinks:go.example.com — solo el host, sinhttps://. Con la firma automática, Xcode activa la capability en el App ID.
(c) Android: las huellas SHA-256#
Pega en la consola (tu app → Enlaces → Deep linking) la huella SHA-256 de las dos claves: laclave de subida que firma tu build y la clave de firma de apps de Play — una app instalada desde Google Play la vuelve a firmar Google, así que sin ella los App Links nunca se verifican para tus usuarios reales.
- Clave de firma de apps y clave de subida: Play Console → Integridad de la app → Firma de apps.
- Una clave de subida gestionada por EAS:
eas credentials -p android; un keystore local:keytool -list -v -keystore upload.jks. - El intent filter lo pone el plugin en Expo, o el fragmento de
AndroidManifest.xmlde arriba. Android verifica el dominio al instalar: tras corregir una huella, reinstala la app.
Para probar, toca un enlace https://go.example.com/c/<code> desde Notas, Mensajes o un correo — una URL escrita en la barra de direcciones del navegador nunca abre una app, en ninguno de los dos sistemas.
Deep links diferidos#
Android: determinista#
El Play Install Referrer lleva el click id, así que en el primer arranque Traqio sabe exactamente qué enlace se tocó, sea cual sea el tiempo entre el toque y la instalación. No hay nada que configurar.
iOS: una coincidencia por IP opcional#
iOS no da ningún referrer. Cuando activas Asociar deep links diferidos por IP (iOS) para una app (desactivado por defecto), el primer arranque se asocia a un clic en uno de los enlaces de esa app desde la misma dirección IP en la hora anterior — y solo si:
- la dirección no es una VPN, un proxy ni un relay, que entregarían el enlace de una persona a muchas;
- se hizo clic exactamente en un enlace con deep link desde ella — dos enlaces desde una dirección son dos personas.
Dirige, nunca atribuye
Solo una instalación nueva pregunta, una vez, y la respuesta — un enlace o «ningún enlace» — se recuerda. Un usuario existente que actualiza a una versión del SDK con deep linking nunca es dirigido por el clic de otra persona.
Del ordenador al móvil#
Un clic en un enlace de app desde un ordenador ya no termina en una página web de tienda. Traqio muestra una página con un código QR y un código corto (ABC-DEF): el móvil escanea el QR, o la persona abre <tu dominio de tracking>/h y escribe el código. El móvil va entonces a su tienda con el clic del ordenador — en Android en el Play Install Referrer: la instalación se atribuye a ese clic de forma determinista y el deep link diferido de arriba le sigue.
- Sin huella ni comparación de IP: el código es lo único que une las dos pantallas.
- Un clic, no dos: el móvil continúa el clic del ordenador, no registra otro.
- El código vale 30 minutos; recargar la página da uno nuevo.
- Los enlaces a un sitio web, y las apps sin tienda, mantienen la redirección simple.
La ficha de cada enlace en la consola cuenta los clics de ordenador que vieron la página, los continuados en un móvil y las instalaciones que siguieron.
En la app#
Traqio.onDeepLink(({ deepLink, code, deferred, via }) => {
if (deepLink) router.push(deepLink);
});| Campo | Significado |
|---|---|
deepLink | el destino definido en el enlace, o null si el enlace no tiene ninguno |
code | el slug del enlace — qué enlace trajo al usuario, incluso sin destino |
deferred | true cuando el enlace se tocó antes de la instalación |
via | referrer (Android, determinista), ip_match (iOS, probabilístico) o link (apertura directa) |
Un enlace resuelto antes de que haya ninguna suscripción se entrega al suscribirse, así que un arranque en frío nunca pierde el enlace que abrió la app. Cómo recibe las URLs cada SDK — automáticamente o reenviadas por tu app — está en su página, desde el resumen de los SDK. Para desactivar el deep linking por completo, pasa deepLinking: false en init.
Preguntas frecuentes#
- ¿Tengo que alojar yo apple-app-site-association o assetlinks.json?
- No. Traqio sirve los dos archivos en tu dominio de seguimiento de marca, generados a partir del Apple Team ID, el bundle id, el paquete de Android y las huellas SHA-256 que indicas en la consola. Solo declaras el dominio en la app: en Expo lo hace el config plugin @traqio/expo; en Xcode, Associated Domains → applinks:<dominio>; en Android, un intent filter autoVerify para https://<dominio>/c/.
- ¿Qué es el deep linking diferido?
- El deep linking diferido lleva a un usuario que tocó un enlace antes de instalar la app al destino del enlace en el primer arranque de la app, tras la instalación. Traqio lo resuelve de forma determinista en Android a partir del Google Play Install Referrer; en iOS, que no tiene referrer, solo mediante una coincidencia por IP que activas por app.
- ¿Necesito mi propio dominio para los deep links?
- Para los deep links directos — un enlace que abre la app ya instalada —, sí: iOS y Android solo abren una app para enlaces de un dominio que la app declara, y un dominio compartido no puede ser declarado por todas las apps que lo usan. Los deep links diferidos funcionan en el dominio compartido.
- ¿Traqio usa el portapapeles para los deep links diferidos en iOS?
- No. Leer el portapapeles muestra al usuario el aviso de pegado de iOS y solo funciona desde Safari. El deep link diferido de Traqio en iOS es una coincidencia por misma IP que se activa voluntariamente, y solo dirige la primera pantalla — nunca atribuye la instalación.
- ¿Qué pasa cuando alguien hace clic en un enlace de app de Traqio desde un ordenador?
- Ve una página con un código QR y un código de seis caracteres en lugar de una página de tienda. Escanear el QR, o escribir el código en la página /h de tu dominio de tracking desde el móvil, envía el móvil a su tienda con el clic del ordenador: la instalación se atribuye a ese clic de forma determinista y el deep link diferido le sigue. Sin huella ni comparación de IP. El código vale 30 minutos.