Appy

Herramienta gratuita

Generador de AASA y assetlinks.json

Crea el archivo apple-app-site-association para los Universal Links de iOS y el assetlinks.json para los App Links de Android. Introduce los datos de tu app y copia o descarga un archivo listo para subir.

  • Gratis, sin cuenta
  • Funciona en tu navegador
  • Formato components actual de Apple

¿Ya tienes los archivos? Revísalos con el validador

Apps

Añade cada app que deba abrir enlaces de este dominio. Cada una se convierte en una entrada de appIDs.

  1. App 1

    10 caracteres, en tu cuenta de Apple Developer, en Membership details.

    Del target de tu app en Xcode, por ejemplo com.example.app.

Rutas que abren la app

Las reglas se revisan de arriba abajo y gana la primera que coincide, así que pon las exclusiones encima de las reglas más amplias. * equivale a cualquier número de caracteres y ? a uno exacto.

  1. Regla 1

    pares nombre=valor unidos con &

Otros servicios

Tu archivo

apple-app-site-association

Ejemplo. Rellena tus datos para sustituirlo.

{
  "applinks": {
    "details": [
      {
        "appIDs": [
          "ABCDE12345.com.example.app"
        ],
        "components": [
          {
            "/": "/*"
          }
        ]
      }
    ]
  }
}

Se genera en tu navegador. No se envía nada a ningún sitio.

Dónde alojarlo

  1. Súbelo a https://tu-dominio/.well-known/apple-app-site-association, sin extensión .json.
  2. Sírvelo por HTTPS con un certificado válido y un 200 directo, sin redirecciones.
  3. Envía la cabecera Content-Type: application/json.
  4. Repítelo en cada host de tus enlaces: example.com y www.example.com necesitan cada uno el archivo y su entrada applinks:.
  5. La CDN de Apple recoge el archivo nuevo en un plazo de 24 horas. Mientras tanto, prueba con ?mode=developer.
Revisar un dominio con el validador

¿Prefieres no alojar archivos tú mismo? Los smart links son gratis, y en Enterprise Appy sirve los dos archivos en el dominio de enlaces de tu app.

Crea un enlace gratis

Cómo encaja todo

Dos archivos, una verificación mutua

Los Universal Links y los App Links solo abren tu app cuando las dos partes responden la una por la otra. La app nombra el dominio y un archivo en ese dominio nombra la app. Si falta una de las dos mitades, el enlace abre tu web.

App de iOS

Entitlement Associated Domains

applinks:example.com

Tu dominio

example.com/.well-known/

  • apple-app-site-association

    Indica el app ID: Team ID más bundle ID

    ABCDE12345.com.example.app
  • assetlinks.json

    Indica el nombre del paquete y la huella SHA-256

    com.example.app · 14:6D:E9:…

App de Android

Intent filter con autoVerify

android:autoVerify="true"android:host="example.com"

Las dos mitades coinciden: el enlace abre la app

Falta algo: el enlace abre tu web

iOS descarga el archivo a través de la CDN de Apple al instalar la app y busca cambios aproximadamente una vez por semana. Android verifica al instalar la app. Ninguno consulta tu dominio en el momento del toque.

Campo a campo

Qué significa cada clave de los archivos

Los dos archivos son JSON sin más. Estas son las claves que escribe el generador y las opcionales que conviene conocer.

apple-app-site-association

applinks
El servicio de Universal Links. Todo lo que decide qué URL abre qué app va aquí dentro.
details
Una lista de entradas que emparejan un grupo de apps con un grupo de reglas de URL. Usa varias si distintas apps gestionan rutas distintas.
appIDs
App IDs con el formato <Team ID>.<bundle ID>, por ejemplo ABCDE12345.com.example.app. Cada app debe incluir también el dominio en su entitlement Associated Domains.
components
Las reglas de URL, revisadas en orden. La primera que coincide decide si se abre la app.
/
Un patrón para la ruta de la URL, como /products/*. Si lo omites, vale cualquier ruta.
?
Parámetros de consulta que deben coincidir, como diccionario. {"ref": "?*"} exige un parámetro ref no vacío.
#
Un patrón para el fragmento que va tras #.
exclude
Ponlo en true para que las URL que coinciden se queden en la web. Coloca estas reglas encima de las más amplias.
comment
Una nota para quien lea el archivo. iOS la ignora.
webcredentials
Opcional. Indica qué apps pueden usar con el autorrelleno las contraseñas guardadas para esta web.
appclips
Opcional. Indica qué App Clips puede abrir este dominio.

* equivale a cualquier número de caracteres, ? a uno exacto y ?* a uno o más. La coincidencia distingue mayúsculas y minúsculas salvo que añadas "caseSensitive": false.

assetlinks.json

[ ]
El archivo es un array JSON de declaraciones, aunque solo tenga una.
relation
delegate_permission/common.handle_all_urls permite que la app abra enlaces de este sitio. delegate_permission/common.get_login_creds añade credenciales compartidas.
target
La app a la que se refiere la declaración.
namespace
Siempre android_app para una app de Android.
package_name
El applicationId de la app, por ejemplo com.example.app.
sha256_cert_fingerprints
Huellas SHA-256 de los certificados que firman la app, en pares en mayúsculas separados por dos puntos. Incluye cada clave que firme las builds que instala la gente.
relation_extensions
Opcional, Android 15 y posteriores. Su dynamic_app_link_components añade reglas de ruta al estilo de los components de Apple. Las versiones anteriores lo ignoran.

El formato antiguo con paths

Antes de iOS 13, cada entrada tenía un único appID, un array paths con NOT delante de las exclusiones, y el archivo necesitaba un array apps vacío. iOS 13 y posteriores leen appIDs y components. El generador solo escribe el formato moderno. Si aún das soporte a iOS 12, añade las claves antiguas a la misma entrada.

Antiguo, iOS 12 y anteriores
{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "ABCDE12345.com.example.app",
      "paths": ["NOT /help/website/*", "/buy/*"]
    }]
  }
}
Moderno, iOS 13 y posteriores
{
  "applinks": {
    "details": [{
      "appIDs": ["ABCDE12345.com.example.app"],
      "components": [
        {"/": "/help/website/*", "exclude": true},
        {"/": "/buy/*"}
      ]
    }]
  }
}

Errores frecuentes

Por qué falla un archivo que parece correcto

El JSON puede ser válido y los enlaces seguir abriendo la web. Revisa estos siete puntos antes que nada.

  1. 01iOS

    Prefijo de Team ID equivocado

    El archivo carga, pero iOS nunca abre la app.

    Solución

    Usa el Team ID de la cuenta que firma la versión publicada, el de Membership details. No el ID numérico de App Store, ni un Key ID, ni el equipo de una agencia si la app se publica desde tu cuenta.

    Guía completa de Universal Links para iOS y Android
  2. 02Android

    Clave de subida en lugar de la clave de firma de apps de Play

    Tus propias builds abren la app; las instalaciones desde Google Play abren el navegador.

    Solución

    Google firma las apps que distribuye con la clave de firma de apps. Copia su SHA-256 en Play Console, en Integridad de la app, y deja la clave de subida en la lista solo si compartes builds firmadas con ella.

    App Links de Android sin verificar: diagnóstico en cinco minutos con adb
  3. 03iOS + Android

    El archivo está detrás de una redirección

    La URL se abre bien en el navegador, pero la verificación falla.

    Solución

    Apple y Android esperan un 200 en la URL exacta. Excluye /.well-known/ de las redirecciones del dominio sin www al www, a la inversa y por idioma.

    ¿Universal Links abren Safari? Corrige AASA, App Links, redirecciones y headers
  4. 04iOS + Android

    Content type erróneo, o HTML en lugar de JSON

    El archivo está ahí, pero la plataforma lo ignora.

    Solución

    Sirve los dos archivos como application/json. Muchos servidores envían el AASA, que no tiene extensión, como application/octet-stream, y algunos alojamientos responden con una página de acceso o un control antibots.

    ¿Universal Links abren Safari? Corrige AASA, App Links, redirecciones y headers
  5. 05iOS + Android

    Olvidar el host www

    Los enlaces a example.com abren la app; los de www.example.com abren la web.

    Solución

    Cada host se comprueba por separado. Sube el archivo a los dos, inclúyelos en Associated Domains y declara ambos en los intent filters de Android.

    Guía completa de Universal Links para iOS y Android
  6. 06iOS

    Una exclusión debajo de una regla general

    Páginas que querías dejar en la web abren la app.

    Solución

    Gana la primera regla que coincide. Sube las reglas exclude por encima de /*, como hace el ejemplo de Appy en el generador.

  7. 07iOS

    Extensión .json o carpeta equivocada

    No hay nada en la dirección que pide iOS.

    Solución

    El archivo se llama apple-app-site-association, sin extensión, y va en /.well-known/. El botón de descarga de arriba ya usa ese nombre.

Olvídate del alojamiento

Deja que Appy sirva los dos archivos

En Enterprise, tu app recibe su propio dominio de enlaces y Appy aloja en él apple-app-site-association y assetlinks.json, generados a partir del Team ID, el bundle ID, el paquete y las huellas que registres. Los smart links son gratis y los deep links llegan con Pro.

  • Plan gratuito
  • Sin tarjeta de crédito
  • Clics ilimitados en todos los planes
  • Tus enlaces siguen funcionando si cancelas

Preguntas frecuentes

¿Qué es un archivo apple-app-site-association?

Un archivo JSON en tu dominio que indica a iOS qué apps pueden abrir qué URL tuyas como Universal Links. Está en https://tu-dominio/.well-known/apple-app-site-association, no tiene extensión y enumera los app IDs (Team ID más bundle ID) con las reglas de URL de cada uno.

¿Qué es assetlinks.json?

Su equivalente en Android, basado en Digital Asset Links de Google. Está en https://tu-dominio/.well-known/assetlinks.json e indica el paquete y las huellas del certificado de firma de la app que puede abrir tus enlaces. Android lo comprueba al instalar la app y solo entonces trata tus enlaces como App Links verificados.

¿Dónde subo los archivos generados?

A la carpeta /.well-known/ en la raíz de cada host que uses en tus enlaces. Los dos deben cargarse por HTTPS con un 200 directo, sin redirecciones y con el content type application/json. En alojamientos estáticos suele hacer falta una regla de cabeceras para el AASA, porque no tiene extensión.

¿Dónde encuentro mi Team ID y mi bundle ID?

El Team ID está en tu cuenta de Apple Developer, en Membership details. El bundle ID aparece en la pestaña General del target de tu app en Xcode. Juntos forman el app ID, por ejemplo ABCDE12345.com.example.app.

¿Cómo obtengo la huella SHA-256 para assetlinks.json?

Si Google Play firma tu app, abre Play Console, entra en Integridad de la app y copia la SHA-256 del certificado de la clave de firma de apps. Para las claves que guardas tú, ejecuta keytool -list -v -keystore my-release-key.keystore o ./gradlew signingReport. El generador acepta el valor con o sin dos puntos.

¿El AASA debe usar paths o components?

Usa components. Apple lo introdujo con iOS 13 y admite parámetros de consulta, fragmentos, exclusiones y comentarios. El array paths antiguo solo hace falta si aún das soporte a iOS 12 o anteriores; en ese caso, pon los dos en la misma entrada.

¿Un archivo puede cubrir varias apps?

Sí. En el AASA, enumera cada app ID en appIDs o añade entradas details separadas si las apps gestionan rutas distintas. En assetlinks.json, añade una declaración por paquete al array. El generador admite varias apps de iOS; para un segundo paquete de Android, copia la declaración y cambia el nombre del paquete y las huellas.

¿Cuánto tardan los cambios en llegar a los dispositivos?

Según Apple, su CDN solicita tu archivo AASA en un plazo de 24 horas, y los dispositivos buscan cambios aproximadamente una vez por semana tras la instalación. Android verifica al instalar la app; en un dispositivo de pruebas, adb shell pm verify-app-links --re-verify com.example.app repite la comprobación.

¿Tengo que firmar el archivo AASA?

No. Firmarlo con tu certificado TLS solo era necesario en iOS 8. Desde iOS 9, Apple espera un archivo JSON sin firmar servido por HTTPS.

¿Se envía a Appy algo de lo que escribo?

No. Los archivos se generan con código que se ejecuta en tu navegador y nada de lo que escribes se sube ni se guarda. El validador funciona de otra forma: descarga los archivos de tu dominio cuando lo ejecutas.