Enlaces de aplicaciones Android
Filtros de intención, assetlinks.json, y enlaces verificados - el manual de Android para abrir URLs https:// directamente en tu aplicación Expo SDK 57 sin la hoja de desambiguación "Abrir con".
Busca en todas las páginas de la documentación
Filtros de intención, assetlinks.json, y enlaces verificados - el manual de Android para abrir URLs https:// directamente en tu aplicación Expo SDK 57 sin la hoja de desambiguación "Abrir con".
Tarjeta de referencia rápida - lista para copiar y pegar.
// app.config.ts
export default {
expo: {
android: {
package: "com.example.shopapp",
intentFilters: [
{
action: "VIEW",
autoVerify: true,
data: [
{
scheme: "https",
host: "shop.example.com",
pathPrefix: "/orders",
},
],
category: ["BROWSABLE", "DEFAULT"],
},
],
},
},
};// https://shop.example.com/.well-known/assetlinks.json
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.shopapp",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:10:D4:4A:8F:D8:00:6F:8F:95:34:E7:6B:58"
]
}
}
]Cuándo usarlo:
assetlinks.json al lado.https://shop.example.com/....Configuración de verificación completa para https://shop.example.com/orders/*.
Paso 1 - Filtros de intención en app.config.ts
// app.config.ts
import type { ExpoConfig } from "expo/config";
const config: ExpoConfig = {
name: "ShopApp",
slug: "shop-app",
scheme: "shopapp",
android: {
package: "com.example.shopapp",
intentFilters: [
{
action: "VIEW",
autoVerify: true,
data: [
{
scheme: "https",
host: "shop.example.com",
pathPrefix: "/orders",
},
{
scheme: "https",
host: "shop.example.com",
pathPrefix: "/product",
},
],
category: ["BROWSABLE", "DEFAULT"],
},
],
},
ios: {
bundleIdentifier: "com.example.shopapp",
associatedDomains: ["applinks:shop.example.com"],
},
};
export default config;Paso 2 - Aloja assetlinks.json
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.shopapp",
"sha256_cert_fingerprints": [
"AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
]
}
}
]Sirvelo en: https://shop.example.com/.well-known/assetlinks.json
Paso 3 - Obtén la huella digital SHA-256
# Play Console -> App integrity -> App signing key certificate -> SHA-256
# Almacén de claves de depuración local (solo compilaciones de desarrollo):
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass androidPaso 4 - Compila y prueba
npx expo prebuild --platform android
npx expo run:android
adb shell am start -a android.intent.action.VIEW -d "https://shop.example.com/orders/42" com.example.shopappPaso 5 - Verifica el estado de verificación
adb shell pm get-app-links com.example.shopappBusca shop.example.com: verified - none o legacy_failure significa que hay que corregir el hosting o la huella digital.
Lo que esto demuestra:
autoVerify: true activa la verificación de dominio en tiempo de instalación.pathPrefix limita qué URLs reclama la aplicación.assetlinks.json para cada host en filtros de intención con autoVerify.shopapp://) omiten la verificación - aún son útiles para desarrollo y OAuth.| Campo | Propósito |
|---|---|
action: "VIEW" | Intención estándar de abrir URL |
category: ["BROWSABLE", "DEFAULT"] | Requerido para manejo de enlaces |
autoVerify: true | Habilitar Digital Asset Links |
data.scheme | https para App Links |
data.host | Dominio sin ruta |
data.pathPrefix | Coincidencia de prefijo de ruta de URL |
data.pathPattern | Ruta regex (escapa con cuidado) |
| Estado | Significado | Acción |
|---|---|---|
verified | Éxito | Publicar |
none | Sin intento / filtro faltante | Verificar manifiesto |
legacy_failure | Huella digital o desajuste JSON | Corregir assetlinks.json |
no_response | Servidor no alcanzable | Corregir CDN / TLS |
# Vuelve a ejecutar la verificación después de corregir assetlinks.json (Android 12+)
adb shell pm verify-app-links --re-verify com.example.shopappassetlinks.json rompen la verificación - sirve 200 en la URL exacta.application/json.android:launchMode en la actividad principal afecta a la pila de retroceso - singleTask es común para aplicaciones con enlaces profundos.autoVerify: true - el filtro funciona pero muestra selector. Corrección: establece autoVerify y reinstala la aplicación.pathPrefix demasiado amplio - / reclama todo el sitio incluyendo blog. Corrección: reduce a /orders, /product.app.config.ts pero ejecutaste APK antiguo. Corrección: npx expo prebuild --clean luego reconstruye.shopapp:// - App Links son solo HTTPS. Corrección: prueba URLs https:// con comando de intención adb.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Filtro de intención de esquema personalizado | OAuth, pruebas internas rápidas | Enlaces HTTPS públicos de marketing |
Solo esquema expo-linking | Prototipo antes de configuración de CDN | Campañas de Android de producción |
| Branch / Firebase Dynamic Links | Atribución diferida | Controlas el dominio y quieres cero SDK |
| Selector de confianza del usuario (sin autoVerify) | Las aplicaciones competidoras comparten dominio | Quieres abrir de un toque |
target con diferentes valores package_name (p.ej. sufijo .dev).pathPrefix: "/orders" coincide con /orders, /orders/42, /orders/42/items.pathPattern usa regex - poderoso pero fácil de desescapar; prefiere el prefijo cuando sea posible.pm get-app-links.data del filtro de intención.pathPrefix.https - http no se verificará automáticamente. Usa HTTPS en todas partes.pm verify-app-links --re-verify después de corregir JSON - sin caché estilo Apple de una hora, pero se aplica TTL de CDN.assetlinks.json y apple-app-site-association en el mismo dominio - ver iOS Universal Links.Versiones de Stack: Esta página fue escrita para React 19.2.3, React Native 0.86.0, y Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última actualización: 16 jul 2026