Saltar al contenido
WebViewGold Del vibe coding a la App Store
Español
Consigue WebViewGold

Claude Code + deep links

Universal Links y App Links con Claude Code: abre tu app WebViewGold desde cualquier enlace

Un enlace a tu dominio en un correo, en un chat o en un login con magic link debería abrir la app en la pantalla correcta, no una pestaña del navegador. Para eso hacen falta dos pequeños archivos JSON en tu servidor, una capability en Xcode, un intent filter en Android y un par de interruptores de WebViewGold. Claude Code escribe, sirve y comprueba los archivos; tú añades los IDs y pruebas en teléfonos reales.

Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.

  • Garantía de aprobación – o te devolvemos el dinero en 14 días
  • Sin programar
  • Pago único, actualizaciones gratuitas
  • Soporte humano 24/7
  • Hecho en Alemania desde 2014 · ISO 27001

Qué tipo de enlace necesitas

Universal Links (iOS) hacen que los enlaces https normales a tu dominio abran la app. Necesitan un archivo apple-app-site-association (AASA) en tu servidor, la capability Associated Domains en Xcode y ShowExternalLink en true en Config.swift (documentación de Universal Links).

App Links (Android) hacen lo mismo en Android. Necesitan un archivo assetlinks.json que demuestre que el dominio pertenece a tu app, un intent filter para tu host en AndroidManifest.xml e IS_DEEP_LINKING_ENABLED en true en Config.java (documentación de App Links).

Los esquemas personalizados como myapp:// también existen, con una sintaxis distinta en cada plataforma: en iOS, myapp://url?link=https://app.example.com/page después de cambiar el esquema de URL en Info.plist; en Android, myapp://https://app.example.com/page con IS_CUSTOM_SCHEME_ENABLED y CUSTOM_DEEPLINK_SCHEME coincidiendo con el manifiesto. La documentación de iOS aconseja elegir Universal Links o el esquema personalizado, no ambos. Para los enlaces en los que la gente hace clic, https es la mejor opción: cuando la app no está instalada, el mismo enlace simplemente abre tu sitio web.

Ninguna directriz exige deep links, pero deciden si un revisor puede iniciar sesión. Un magic link o un restablecimiento de contraseña que abre Safari en lugar de la app deja la sesión en el sitio equivocado y al revisor atascado en tu pantalla de login. La guía de magic links explica ese caso en detalle.

Qué hace Claude Code y qué haces tú

Claude Code

Escribe ambos archivos JSON, las cabeceras del hosting y las exclusiones del middleware, hace que cada ruta enlazada funcione en una carga en frío y crea un script de comprobación que ejecuta contra tu despliegue con curl y Node.

Tú

Aportas el Team ID, el bundle ID, el nombre de paquete y las huellas de firma, añades Associated Domains en Xcode, editas el host en el manifiesto de Android, activas los interruptores de WebViewGold y compilas.

Apple y Google

Descargan y verifican tus archivos según su propio calendario. Apple sirve el archivo a través de su CDN, así que los cambios no son instantáneos; reserva un poco de tiempo para eso.

iOS y Android, uno al lado del otro

iOS Universal LinksAndroid App Links
Archivo en el servidor/.well-known/apple-app-site-association, sin extensión de archivo/.well-known/assetlinks.json
Identidad de la app en el archivoTeam ID + bundle IDNombre de paquete + SHA-256 del certificado de firma
Proyecto nativoAssociated Domains: applinks:app.example.com (añade www por separado si lo usas)Intent filter con tu host en AndroidManifest.xml, verificado automáticamente
Interruptor de WebViewGoldShowExternalLink = trueIS_DEEP_LINKING_ENABLED = true
Prueba rápidaToca el enlace en Notas o en Mensajesadb shell pm get-app-links y un toque en Gmail o Mensajes

¡Gran trabajo! Nunca tuve que usar código para nada, pero logré trabajar con esto y tener mi App lista. ¡Fácil y rápido! ¡También con gran ayuda de los creadores!

Lucas DuBois · CodeCanyon

El prompt para Claude Code

Rellena primero tus IDs. Merece la pena conservar el script de comprobación del punto 5: ejecútalo después de cada cambio en el hosting o en el middleware, o pide a Claude Code que lo registre como hook con /hooks.

Pégalo en Claude Code
Configura Universal Links (iOS) y App Links (Android) para nuestras apps WebViewGold en https://app.example.com. Primero lee las secciones Universal Links API y App Links and Deep Linking API en https://www.webviewgold.com/llms-full.txt.

Valores: Apple Team ID ABCDE12345, bundle ID de iOS com.example.myapp, nombre de paquete de Android com.example.myapp, huellas SHA-256: [clave de firma de la app de la Play Console] y [clave de subida para compilaciones de prueba locales].

1. Crea public/.well-known/apple-app-site-association (sin extensión de archivo) en el formato applinks con appIDs y components. Se abren en la app: /app/*, /auth/callback*, /invite/*, /reset-password*. Excluye /blog/* y /pricing (pon las exclusiones primero) para que las páginas de marketing se queden en el navegador.
2. Crea public/.well-known/assetlinks.json con la relación delegate_permission/common.handle_all_urls para nuestro nombre de paquete y ambas huellas.
3. Sirve ambos archivos con estado 200 y Content-Type application/json, sin redirecciones, middleware de autenticación, protección por contraseña ni desafíos antibots. Asegúrate de que la ruta catch-all de nuestra SPA y el middleware no intercepten /.well-known/. Configura las cabeceras para el hosting que use este proyecto (headers en next.config.js, vercel.json, _headers de Netlify o similar).
4. Cada ruta indicada en el punto 1 debe funcionar en una carga en frío solo con la URL: los deep links llegan a una URL, no a un estado del cliente. Las rutas protegidas redirigen al login y después de vuelta a la ruta original.
5. Crea scripts/check-deep-links.mjs: recibe una URL base, descarga ambos archivos y comprueba el estado, el content type, la ausencia de redirecciones, que el JSON sea válido y que los IDs coincidan con los valores de arriba. Añade npm run check:links y ejecútalo contra el despliegue de preview.
6. Escribe docs/deep-links.md: los pasos manuales en Xcode (capability Associated Domains con applinks:app.example.com, ShowExternalLink en true en Config.swift) y en Android Studio (host del intent filter y android:autoVerify en AndroidManifest.xml, IS_DEEP_LINKING_ENABLED en Config.java), más una lista de enlaces de ejemplo para cada patrón que pueda pegar en Notas o enviarme a mí mismo, y los comandos adb para probarlos.

No edites los proyectos nativos. Informa de lo que cambiaste y de la salida del script de comprobación.

apple-app-site-association

El formato actual con appIDs y components. Los components se evalúan en orden y gana la primera coincidencia, por eso las exclusiones van primero. El app ID es tu Team ID, un punto y el bundle ID.

json
{
  "applinks": {
    "details": [
      {
        "appIDs": ["ABCDE12345.com.example.myapp"],
        "components": [
          { "/": "/blog/*", "exclude": true, "comment": "Las páginas de marketing se quedan en el navegador" },
          { "/": "/pricing", "exclude": true },
          { "/": "/app/*", "comment": "Todo lo que está dentro de la app web" },
          { "/": "/auth/callback*", "comment": "Magic links y retornos de OAuth" },
          { "/": "/invite/*" },
          { "/": "/reset-password*" }
        ]
      }
    ]
  }
}

assetlinks.json

Con la firma de apps de Play (Play App Signing), Google firma las compilaciones que instalan los usuarios, así que la huella que importa es la de la clave de firma de la app que aparece en la Play Console en Integridad de la app. Añade también tu clave de subida si pruebas compilaciones firmadas en local.

json
[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.example.myapp",
      "sha256_cert_fingerprints": [
        "APP_SIGNING_KEY_SHA256_FROM_PLAY_CONSOLE",
        "UPLOAD_KEY_SHA256_FOR_LOCAL_BUILDS"
      ]
    }
  }
]

Servir los archivos con las cabeceras correctas (Next.js)

Los hostings estáticos suelen enviar un archivo sin extensión con un tipo de descarga, y Apple lo ignora. En Vercel sin Next.js, usa la sección headers de vercel.json; en Netlify, un archivo _headers.

javascript
// next.config.js  (los archivos están en public/.well-known/)
module.exports = {
  async headers() {
    return [
      {
        source: "/.well-known/apple-app-site-association",
        headers: [{ key: "Content-Type", value: "application/json" }],
      },
      {
        source: "/.well-known/assetlinks.json",
        headers: [{ key: "Content-Type", value: "application/json" }],
      },
    ];
  },
};

// Revisa también middleware.ts: excluye "/.well-known" de las redirecciones de autenticación y de idioma.

Los pasos manuales, en orden

Primero los IDs definitivos: el bundle ID, el nombre de paquete y el dominio quedan fijados en estos archivos.

  1. Decide el dominio y los IDs

    Los deep links vinculan tu dominio a la identidad de tu app, así que decide ambos antes de empezar. Consulta primero el dominio propio y elegir el bundle ID una sola vez.

  2. Reúne los valores

    El Apple Team ID en los datos de la membresía de tu cuenta de desarrollador, el bundle ID en Xcode, el nombre de paquete y el SHA-256 de la clave de firma de la app en la Play Console.

  3. Ejecuta el prompt y despliega

    Después ejecuta npm run check:links https://app.example.com contra producción. Ambos archivos deben pasar la comprobación antes de tocar los proyectos nativos.

  4. Proyecto de iOS

    En el portal de Apple Developer, activa Associated Domains para el App ID. En Xcode, selecciona el target de WebViewGold, abre Signing & Capabilities, añade Associated Domains con applinks:app.example.com (y la variante con www si enlazas a ella) y pon ShowExternalLink en true en Config.swift.

  5. Proyecto de Android

    En AndroidManifest.xml, sustituye el host de ejemplo del intent filter de deep links por tu dominio y asegúrate de que lleve android:autoVerify="true". Pon IS_DEEP_LINKING_ENABLED en true en Config.java.

  6. Compila e instala

    TestFlight y pruebas internas. Instala desde los canales de la tienda para que la compilación de Android lleve el certificado de firma de Play que indica tu assetlinks.json. El Cloud Builder puede generar ambas compilaciones si no tienes los IDE instalados.

Checklist de verificación

  • curl -sI https://app.example.com/.well-known/apple-app-site-association devuelve 200, application/json y ninguna redirección. Apple descarga el archivo a través de su CDN; https://app-site-association.cdn-apple.com/a/v1/app.example.com muestra la versión que tiene Apple en este momento.
  • La Digital Asset Links API de Google (digitalassetlinks.googleapis.com/v1/statements:list con tu sitio y la relación handle_all_urls) devuelve tu declaración.
  • iPhone: pega un enlace en Notas o envíatelo por Mensajes y tócalo: la app se abre en esa página. Una pulsación larga ofrece abrirlo en tu app. Escribir la URL en la barra de direcciones de Safari no abre la app; es así por diseño.
  • Android: adb shell pm get-app-links com.example.myapp muestra tu dominio como verificado. Un toque en Gmail o Mensajes abre la app; adb shell am start -a android.intent.action.VIEW -d "https://app.example.com/app/orders/42" com.example.myapp llega a la página correcta.
  • Con la app desinstalada, los mismos enlaces abren el sitio web con normalidad.
  • Solicita un magic link o un restablecimiento de contraseña dentro de la app y abre el correo en el mismo teléfono: la app se abre y el usuario tiene la sesión iniciada.
  • Una notificación push cuya url apunta a /app/orders/42 abre esa misma página; consulta la guía de push.

Errores frecuentes

  • Redirecciones. Si app.example.com redirige a www (o al revés), la petición del archivo no supera la verificación. Sirve el archivo en cada host que indiques, sin redirección.
  • La huella equivocada. Con Play App Signing, la clave de subida no es la clave con la que se firman las compilaciones de los usuarios. Copia la clave de firma de la app desde la Play Console.
  • Responde la SPA en lugar del archivo. Una ruta catch-all devuelve tu index.html con estado 200 para /.well-known/apple-app-site-association. El script de comprobación lo detecta porque falla el parseo del JSON.
  • Capas de seguridad. Las previews protegidas con contraseña, el middleware de autenticación y los desafíos antibots bloquean a los rastreadores de Apple y de Google igual que a un desconocido.
  • Caché. El CDN de Apple no recoge al instante un archivo AASA modificado. Reinstala la app en tu dispositivo de prueba después de los cambios y deja pasar un tiempo antes de concluir que está roto.
  • Magic links con PKCE entre contextos. Un magic link solicitado en Safari de escritorio y abierto en la app no puede completar un login PKCE, porque el code verifier vive en el navegador que lo solicitó. Solicita el enlace desde donde lo vayas a abrir.

Preguntas frecuentes

¿Universal Links o un esquema de URL personalizado?

Universal Links y App Links para todo aquello en lo que una persona hace clic, porque recurren a tu sitio web cuando falta la app. Los esquemas personalizados son útiles para llamadas entre apps o para códigos QR que solo deben funcionar dentro de la app.

¿Necesito una compilación nueva cuando cambio las rutas?

No para las rutas del archivo AASA ni de assetlinks.json, que viven en tu servidor. Sí necesitas una compilación nueva cuando añades un dominio, porque el dominio forma parte del entitlement Associated Domains y del manifiesto de Android.

¿Por qué el enlace abre Safari cuando lo toco en mi propio sitio web?

Dentro de Safari, un toque en un enlace al mismo dominio se queda en el navegador. Prueba desde Notas, Mensajes o Mail, que es donde hacen clic los usuarios reales.

¿Puede Claude Code probar los deep links en mi teléfono?

Puede verificar la parte del servidor con curl y con el script de comprobación, y escribe los comandos adb para Android. El toque en un dispositivo real es cosa tuya, y lleva dos minutos.

¿Ayudan los deep links en App Review?

De forma indirecta. Hacen que los magic links, los restablecimientos de contraseña y los enlaces compartidos funcionen dentro de la app, lo que mantiene al revisor con la sesión iniciada y dentro de la app en lugar de perdido en un navegador.

Tres formas de llevar tu app a las tiendas

El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.

Hazlo tú mismo

$109 por plataforma, pago único

La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.

Ver planes en la página principal

Full Service

$698 por plataforma $798

Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.

Detalles del Full Service Con tecnología de WeSetupYourWebViewApp

Precios de la Oferta de invierno válidos hasta el 31 de diciembre de 2026.

¿Listo para lanzar tu app?

Garantía de aprobación en App Store & Google Play – o te devolvemos el dinero en 14 días

¿Prefieres delegarlo? Full Service: configuramos, compilamos y entregamos en 72 horas, desde $698 por plataforma. ¿Preguntas? Chatea con nosotros 24/7.

Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.