Los App Links son vínculos directos que usan el esquema HTTP o HTTPS y que Android verifica como asociados a tu sitio web. Para registrarte y controlar los vínculos de la app, sigue estos pasos:
- Agrega uno o más filtros de intents al manifiesto de tu app que especifiquen el dominio o las URLs de tu sitio web.
- Agrega
autoVerify="true"attributea los elementos del filtro de intents. Esto indica al sistema que debe intentar verificar el esquema y los dominios de host en relación con la configuración deassetlinks.jsonde tu sitio web. - Declara asociaciones de sitios web.
A continuación, se muestra un ejemplo de una declaración de App Link con esquemas y hosts, así como autoVerify="true":
<activity
android:name=".MainActivity"
android:exported="true"
...>
<!-- Make sure you explicitly set android:autoVerify to "true". -->
<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" />
<!-- If a user clicks on a link that uses the "http" scheme, your
app should be able to delegate that traffic to "https". -->
<!-- Do not include other schemes, as this will prevent verification. -->
<data android:scheme="http" />
<data android:scheme="https" />
<!-- Include one or more domains that should be verified. -->
<data android:host="www.example.com" />
<data android:host="*.example.com" />
</intent-filter>
</activity>
Puntos clave sobre el código
- AutoVerify: El atributo
android:autoVerify="true"es obligatorio para los App Links. Le indica al sistema que debe intentar verificar la asociación entre tu app y los esquemas y dominios especificados en las etiquetas<data>. Se recomienda agregarautoVerify="true" a cada filtro de intents que desees que se pueda verificar. - Elementos de datos: Cada filtro de intents de vínculos en la app debe incluir uno o más elementos
<data>que especifiquen los esquemas y los formatos de host que coincidan con el dominio de tu sitio web verificable. - Esquemas: El filtro de intents debe incluir elementos
<data>para los esquemashttpyhttps. Hosts: De manera opcional, puedes agregar elementos
<data>para que coincidan con uno o más hosts. Usa un comodín (*) para que coincidan varios subdominios (como*.example.com). El sistema intentará verificar cada host con tu archivo assetlinks.json en tu sitio web. Ten en cuenta que el archivo assetlinks.json debe controlar cualquier enrutamiento a nivel de la ruta de acceso (consulta la sección de prácticas recomendadas a continuación).Varios hosts: Si declaras varios dominios de host, el sistema (en Android 12 y versiones posteriores) intentará verificar cada uno de ellos. Si se verifica algún host, la app se convierte en el controlador predeterminado para los vínculos de ese host verificado. En Android 11 y versiones anteriores, la verificación falla si no se puede verificar al menos un host.
Varios filtros de intents: Es importante crear filtros separados cuando tu intención es declarar URLs únicas (como una combinación específica de esquema y host), ya que se fusionan varios elementos
<data>en el mismo filtro de intents para representar todas las variaciones de sus atributos combinados.
Consideraciones para las reglas de filtro de manifiesto
Si configuras filtros para usarlos con App Links dinámicos en Android 15 y versiones posteriores, es importante recordar que las reglas dinámicas declaradas en el archivo assetlinks.json del servidor no pueden expandir el alcance de las reglas de URL que declaras de forma estática en el manifiesto de la app.
Por este motivo, te recomendamos que uses este enfoque:
- En el manifiesto de tu app, establece el alcance más amplio posible, por ejemplo, declarando solo el esquema y el dominio.
- Confía en las reglas de assetlinks.json del servidor para realizar ajustes adicionales, como el enrutamiento a nivel de la ruta de acceso.
Con esta configuración ideal, podrás agregar de forma dinámica nuevas rutas de vínculos de la app en el archivo assetlinks.json según sea necesario, sabiendo que se ajustarán al amplio alcance que estableciste en el manifiesto de la app.
Admite vínculos de apps para varios hosts
El sistema debe poder verificar el host especificado en los elementos de datos de los filtros de intents de URL de la app en comparación con los archivos de Vínculos de recursos digitales alojados en los dominios web respectivos en ese filtro de intents. Si la verificación falla, el sistema adopta su comportamiento estándar de forma predeterminada para resolver el intent, como se describe en Cómo crear vínculos directos al contenido de la app. Sin embargo, la app se puede verificar como controlador predeterminado para cualquiera de los patrones de URL definidos en los otros filtros de intents de la app.
Por ejemplo, una app con los siguientes filtros de intents pasará la verificación solo para https://www.example.com si se encuentra un archivo assetlinks.json en https://www.example.com/.well-known/assetlinks.json, pero no en https://www.example.net/.well-known/assetlinks.json:
<application>
<activity android:name="MainActivity">
<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="http" />
<data android:scheme="https" />
<data android:host="www.example.com" />
</intent-filter>
</activity>
<activity android:name="SecondActivity">
<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="https" />
<data android:host="www.example.net" />
</intent-filter>
</activity>
</application>
Cómo admitir vínculos de aplicaciones para varios subdominios
El protocolo de Vínculos de recursos digitales trata los subdominios de tus filtros de intents como hosts independientes y únicos. Por lo tanto, si tu filtro de intents enumera varios hosts con subdominios diferentes, debes publicar un assetlinks.json válido en cada dominio.
Por ejemplo, el siguiente filtro de intents incluye www.example.com y mobile.example.com como hosts de URL de intents aceptados. Por lo tanto, un assetlinks.json válido debe publicarse en https://www.example.com/.well-known/assetlinks.json y https://mobile.example.com/.well-known/assetlinks.json.
<application>
<activity android:name="MainActivity">
<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" />
<data android:scheme="https" />
<data android:host="www.example.com" />
<data android:host="mobile.example.com" />
</intent-filter>
</activity>
</application>
Como alternativa, si declaras tu nombre de host con un comodín (como *.example.com), debes publicar tu archivo assetlinks.json en el nombre de host raíz (example.com). Por ejemplo, una app con el siguiente filtro de intents pasará la verificación de cualquier subnombre de example.com (como foo.example.com) siempre que se publique el archivo assetlinks.json en https://example.com/.well-known/assetlinks.json:
<application>
<activity android:name="MainActivity">
<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" />
<data android:host="*.example.com" />
</intent-filter>
</activity>
</application>
Verifica si hay varias apps asociadas al mismo dominio
Si publicas varias apps asociadas con el mismo dominio, cada una puede verificarse de manera correcta. Sin embargo, si las apps pueden resolver exactamente el mismo host del dominio y la misma ruta de acceso, como puede suceder con las versiones básica y completa de una app, solo la última que se instaló puede resolver intents web para ese dominio.
En un caso como este, verifica si es posible que, en el dispositivo del usuario, existan apps en conflicto, siempre que cuentes con la visibilidad del paquete necesaria. Luego, en la app, muestra un diálogo personalizado del selector que incluya los resultados de las llamadas a queryIntentActivities. El usuario puede seleccionar su app preferida de la lista de apps que coinciden y aparecen en el diálogo.
Retrocompatibilidad de los App Links dinámicos para Android 14 y versiones anteriores
Las funciones de App Link dinámicos, incluidas las reglas de coincidencia avanzadas en assetlinks.json y el uso de <uri-relative-filter-group>, solo son totalmente compatibles con Android 15 (nivel de API 35) y versiones posteriores.
En Android 14 (nivel de API 34) y versiones anteriores, el sistema solo considera los elementos scheme y host declarados en los elementos <data> de tu manifiesto para la verificación de App Link. No se aplican las reglas, las exclusiones ni las actualizaciones dinámicas específicas de la ruta de assetlinks.json.
Esto significa que, si tu manifiesto solo especifica scheme y host, es posible que tu app capture de forma inesperada todas las rutas del dominio verificado en Android 14 y versiones anteriores, independientemente de las reglas específicas de la ruta definidas en tu assetlinks.json para Android 15 y versiones posteriores.
Estrategia alternativa para versiones anteriores de Android que se configurarán sin vínculos directos
Para evitar que tu app controle todos los vínculos de un dominio en Android 14 y versiones anteriores cuando quieras usar App Links dinámicos para rutas más específicas en Android 15 y versiones posteriores, incluye una ruta que no coincida en el filtro de intents de tu manifiesto.
Agrega un elemento <data> con un atributo android:path que es poco probable que alguna vez sea una ruta de acceso válida para tus vínculos. Esto garantiza que el filtro de intents no coincida con todas las rutas en versiones anteriores.
Ejemplo:
<activity
android:name=".MainActivity"
android:exported="true"
...>
<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="http" />
<data android:scheme="https" />
<data android:host="www.example.com" />
<!-- Add a non-matching path for backward compatibility -->
<data android:path="/no_match_for_older_android_versions" />
<uri-relative-filter-group android:allow="true">
<data android:pathPattern="/.*"/>
</uri-relative-filter-group>
</intent-filter>
</activity>
Si agregas <data android:path="/no_match_for_older_android_versions" />, te aseguras de que, en Android 14 y versiones anteriores, este filtro de intents no coincida con ningún vínculo entrante, a la vez que permites que se verifique el dominio para usarlo con vínculos dinámicos en Android 15 y versiones posteriores según las reglas de coincidencia avanzadas en tus reglas de assetlinks.json.
Migración de vínculos de apps existentes
Si ya tienes vínculos de apps con reglas de ruta de acceso específicas (como android:pathPrefix) en tu manifiesto y quieres comenzar a usar vínculos de apps dinámicos en Android 15 y versiones posteriores, puedes agregar de forma segura el elemento <uri-relative-filter-group> directamente a tus filtros de intents existentes.
Dado que Android 14 y las versiones anteriores ignoran el elemento <uri-relative-filter-group>, tus App Links existentes seguirán funcionando exactamente como lo hacen ahora en los dispositivos que ejecutan versiones anteriores de Android.
Sin embargo, debes considerar cuidadosamente cómo Android 15 y versiones posteriores evalúan la configuración "mixta":
- Filtrado de dos capas: En Android 15 y versiones posteriores, el sistema evalúa los filtros de intents como una unión. Una URL pasa la verificación del manifiesto si satisface tus etiquetas
<data>estáticas heredadas o las reglas generales de tu<uri-relative-filter-group>. Una vez que la URL pasa esta verificación inicial del manifiesto, el sistema aplica las reglas dinámicas definidas en tu archivoassetlinks.jsoncomo una segunda capa de filtrado detallado. Esto significa que las reglas JSON del servidor son las que, en última instancia, determinan cuáles de esas URLs coincidentes abren la app.
Ejemplo de una configuración híbrida:
<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" />
<data android:host="www.example.com" />
<!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
also use this. -->
<data android:pathPrefix="/store" />
<!--
Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
evaluate this as a union between all paths and the configuration
specified in the assetlinks.json file. Make sure to apply further
refinements in the assetlinks.json file to prevent all URL paths from
opening in the app.
-->
<uri-relative-filter-group android:allow="true">
<data android:pathPrefix="/" />
</uri-relative-filter-group>
</intent-filter>