Para admitir vínculos de aplicaciones, debes crear un archivo JSON de Vínculos de recursos digitales llamado assetlinks.json y publicarlo en una ubicación conocida de tu sitio web. Este archivo declara públicamente qué apps están autorizadas para controlar los vínculos de tu dominio, y los dispositivos Android recuperarán este archivo de tu servidor para verificar tus vínculos directos.
En el caso de los vínculos directos dinámicos en Android 15 y versiones posteriores, el archivo assetlinks.json también es
donde defines la configuración de las reglas dinámicas, como los comparadores de patrones
para los parámetros de ruta, fragmento y consulta. Los dispositivos Android que ejecutan Android 15
(nivel de API 35) o versiones posteriores y que tienen instalados los Servicios de Google recuperarán periódicamente
el archivo y combinarán tu configuración dinámica con la estática
en el manifiesto de la app.
En esta guía, se describe cómo preparar un archivo assetlinks.json y publicarlo
en tu sitio web. Si lo prefieres, puedes generar un archivo assetlinks.json
desde la herramienta de vínculos directos de Google Play o el App Links Assistant de Android Studio.
Para obtener más información, consulta Herramientas para desarrolladores de vínculos de apps.
Cómo declarar la asociación de sitios web
Debes publicar un archivo JSON de Vínculos de recursos digitales en tu sitio web para indicar las apps para Android que están asociadas con el sitio web y verificar los intents de URL de la app. El archivo JSON usa los siguientes campos para identificar las apps asociadas:
package_name: Es el ID de aplicación declarado en el archivobuild.gradlede la app.sha256_cert_fingerprints: Son las huellas digitales SHA256 del certificado de firma de tu app. Puedes usar el siguiente comando para generar la huella digital con la herramienta keytool de Java:
keytool -list -v -keystore my-release-key.keystore
- Este campo admite varias huellas digitales, que se pueden usar para admitir
diferentes versiones de tu app, como las compilaciones de depuración y producción. Si usas la firma de apps de Play para tu app, por lo general, la huella digital del certificado que se produce cuando ejecutas
keytoolde forma local no coincidirá con la de los dispositivos de los usuarios. Puedes verificar si usas la firma de apps de Play para tu app en la cuenta de desarrollador de Play Console enRelease > Setup > App signing. Si es así, también encontrarás el fragmento JSON de Vínculos de recursos digitales correcto para tu app en la misma página.
En el siguiente ejemplo, el archivo assetlinks.json otorga derechos de apertura de vínculos a una app para Android com.example:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
Cómo asociar un sitio web con varias apps
Un sitio web puede declarar asociaciones con varias apps dentro del mismo archivo assetlinks.json. En la siguiente lista de archivos, se muestra un ejemplo de un archivo de declaración que indica la asociación con dos apps, por separado, y reside en https://www.example.com/.well-known/assetlinks.json:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.puppies.app",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.monkeys.app",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
Distintas apps pueden manejar los vínculos para recursos diferentes en el mismo host web.
Por ejemplo, app1 puede declarar un filtro de intents para https://example.com/articles, y app2 puede declarar un filtro de intents para https://example.com/videos.
Asocia varios sitios web con una sola app
Varios sitios web pueden declarar asociaciones con la misma app en sus respectivos archivos assetlinks.json. En las siguientes listas de archivos, se muestra un ejemplo de cómo
declarar la asociación de example.com y example.net con app1. En la primera lista, se muestra la asociación de example.com con app1:
https://www.example.com/.well-known/assetlinks.json
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.mycompany.app1",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
En la siguiente lista, se muestra la asociación de example.net con la app1. Solo cambia la ubicación en la que se alojan estos archivos (.com y .net):
https://www.example.net/.well-known/assetlinks.json
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.mycompany.app1",
"sha256_cert_fingerprints":
["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
Configura reglas dinámicas
Los vínculos dinámicos de apps en Android 15 y versiones posteriores te permiten usar reglas de coincidencia de vínculos directos del servidor que funcionan junto con las reglas que definiste de forma estática en el manifiesto de la app. En el archivo assetlinks.json, defines las reglas dinámicas. Este campo es opcional.
Los dispositivos Android que ejecutan Android 15 (nivel de API 35) o versiones posteriores y que tienen instalados los servicios de Google recuperarán periódicamente este archivo de tu servidor y combinarán la configuración de reglas dinámicas con la configuración estática en el manifiesto de la app. A continuación, se muestra un ejemplo de un archivo assetlinks.json con
reglas dinámicas:
[
{
"relation": [
"delegate_permission/common.handle_all_urls"
],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [...]
},
"relation_extensions": {
"delegate_permission/common.handle_all_urls": {
"dynamic_app_link_components": [
{"?": {"dl": "*"}},
{"#": "app"},
{"/": "/products/*"},
{"/": "/shoes", "?": {"in_app": "true"}},
{"/": "*", "exclude": true}
]
}
}
}
]
Puntos clave sobre el código
- Los vínculos de apps dinámicos agregan una nueva extensión de relación de Vínculos de recursos digitales llamada
dynamic_app_link_components, que es donde configuras tus reglas dinámicas. - Las reglas dinámicas pueden incluir comparadores de patrones para los parámetros de ruta, fragmento y consulta.
- También puedes marcar cualquier comparador de patrones como excluido para que las URLs que coincidan no abran tu app.
- En este ejemplo, se muestran comparadores para la ruta de acceso (
"/"), el fragmento ("#") y los parámetros de consulta ("?"), así como comparadores excluidos ("exclude"). - Si alguno de los campos del archivo tiene un formato incorrecto o está vacío, Android descarta las reglas dinámicas y el dispositivo recurre a las reglas que se definen de forma estática en el manifiesto de la app.
Las reglas dinámicas solo pueden especificar reglas que se apliquen dentro del alcance de los dominios que declares en el archivo de manifiesto de tu app. Consulta la sección Declara reglas dinámicas.
Declara reglas dinámicas
Los vínculos dinámicos a la app admiten una nueva extensión de relación dynamic_app_link_components, que contiene un array de objetos de reglas. Cada regla se define con
coincidencias de patrones para rutas de acceso, fragmentos y parámetros de consulta que abrirán tu
app. Las coincidencias también se pueden excluir de forma individual para que no abran tu
app. Todas estas opciones son opcionales.
- Coincidencia de ruta
- Tecla: "/"
- Valor: Cadena única, expresión de coincidencia para la ruta de URL
- Coincidencia de fragmentos
- Tecla: "#"
- Valor: Cadena única, expresión de coincidencia para el fragmento de URL
- Coincidencia de parámetros de consulta
- Tecla: "?"
- Valor: Es un diccionario para hacer coincidir pares clave-valor en los parámetros de consulta de la URL.
- Por ejemplo, el diccionario {"
?", {"dl": "*", "in_app":"true"} coincidirá con la cadena de consulta "?in_app=true&dl=abc". - No es necesario que el orden de los pares clave-valor en el diccionario coincida con el orden de los pares en la cadena de consulta. Además, no es necesario que el diccionario coincida con todos los pares clave-valor de la cadena de consulta, pero se debe encontrar una coincidencia para cada entrada del diccionario.
- Por ejemplo, el diccionario también coincidiría con la cadena de consulta
"
?lang=en&in_app=true&tz=pst&dl=abc", pero no con la cadena de consulta "?lang=en&tz=pst&dl=abc".
- Excluido
- Clave: "exclude"
- Valor: Es un valor booleano opcional para cada regla definida en
dynamic_app_link_components(consulta el ejemplo).
Puedes usar estos caracteres especiales en los comparadores de patrones:
- "*" coincide con cero o más caracteres hasta que se encuentra el carácter después del comodín en el patrón en la cadena coincidente
- "?" coincide con cualquier carácter
- "?*" coincide con 1 o más caracteres
No hay otras restricciones de caracteres para los valores.
Ordena las reglas dinámicas
El orden en que se declaran las reglas es importante. Android evalúa cada regla en orden hasta que encuentra una coincidencia.
En el siguiente ejemplo, se muestra cómo el orden puede afectar el manejo. La primera regla coincide con todas las rutas de acceso ("*"), pero excluye las coincidencias (exclude: true), lo que significa que excluye todas las URLs para que no abran la app. En este caso, nunca se evaluará la segunda regla que permite "/path1".
dynamic_app_link_components: [
{"/": "*", "exclude": true},
{"/": "/path1"}
]
Sin embargo, en el siguiente ejemplo, la regla "/path1" se declara primero, por lo que se evaluará primero y abrirá la app para una URL que coincida con "/path1". La segunda regla, que excluye todas las URLs para que no abran la app, se evaluará en segundo lugar, pero solo si la primera regla no coincide.
dynamic_app_link_components: [
{"/": "/path1"},
{"/": "*", "exclude": true}
]
Si no se encuentran coincidencias en la lista de componentes declarados, la URL no abrirá la app. En el siguiente ejemplo, ninguna de las rutas de acceso coincide con "/path3", por lo que el dispositivo tratará esta ruta de acceso como excluida.
dynamic_app_link_components: [
{"/": "/path1"},
{"/": "/path2"}
]
Este comportamiento es importante si deseas que dynamic_app_link_components solo
excluya ciertas partes de la URL, pero permita todas las demás. En el siguiente ejemplo,
omitir la regla final para permitir todas las rutas de acceso restantes significaría que todas las URLs
se excluyen de la app.
dynamic_app_link_components: [
{"/": "/path1", "exclude": true},
{"/": "*"}
]
Define correctamente el alcance de tus reglas dinámicas
Cuando definas tus reglas del servidor para usarlas con los vínculos dinámicos a la app en Android 15 y versiones posteriores, es importante que las limites de forma adecuada para que funcionen con los filtros de intents estáticos declarados en el manifiesto de tu app y los complementen.
Las reglas dinámicas declaradas en el archivo assetlinks.json solo pueden especificar reglas para
los hosts que declares en el archivo AndroidManifest.xml de tu app. Las reglas dinámicas 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 tus reglas dinámicas y estáticas:
- En el manifiesto de la app, establece reglas con el alcance más amplio posible, por ejemplo, declarando solo el esquema y el dominio.
- Confía en las reglas dinámicas del servidor para un mayor perfeccionamiento, 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 acceso de App Links 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.
Declara dynamic_app_link_components solo una vez
Para controlar correctamente tus reglas, declara solo un objeto dynamic_app_link_components en las declaraciones de un sitio, una relación y una app determinados.
- Busca varias declaraciones para el mismo sitio, relación y app que declaren un objeto dynamic_app_link_components.
- Busca varios objetos dynamic_app_link_components que se declaren en una sola sentencia.
En estos casos, Android no garantiza qué configuración de reglas dinámicas se usará.
Compatibilidad de las reglas dinámicas con configuraciones anteriores de App Links
Si ya admites App Links, puedes agregar compatibilidad con App Links dinámicos directamente en tu archivo assetlinks.json existente. Los campos de relación para verificar tus vínculos de apps siguen siendo los mismos, y puedes agregar los nuevos campos de extensión de relación para las reglas dinámicas sin ningún otro cambio.
Los dispositivos Android que ejecutan Android 14 (nivel de API 34 o anterior) ignoran los nuevos campos de extensión de relación para las reglas dinámicas, mientras que los dispositivos que ejecutan Android 15 y versiones posteriores combinarán esas reglas con las definidas en el manifiesto.
Publica el archivo de verificación JSON
Debes publicar tu archivo de verificación JSON en la siguiente ubicación:
https://domain.name/.well-known/assetlinks.json
Asegúrate de lo siguiente:
- El archivo
assetlinks.jsonse entrega con el tipo de contenidoapplication/json. - Se debe poder acceder al archivo
assetlinks.jsona través de una conexión HTTPS, independientemente de si los filtros de intents de tu app declaran HTTPS como el esquema de datos. - Se debe poder acceder al archivo
assetlinks.jsonsin redireccionamientos (sin redireccionamientos 301 ni 302). - Si tus App Links admiten varios dominios alojados, debes publicar el archivo
assetlinks.jsonen cada dominio. Consulta Cómo admitir la vinculación de apps para varios hosts. - No publiques tu app con URLs de prueba en el archivo de manifiesto que podrían no ser accesibles para el público (como las que solo son accesibles con una VPN). Una solución alternativa en estos casos es configurar variantes de compilación para generar un archivo de manifiesto diferente para las compilaciones de desarrollo.
Consulta las siguientes guías relacionadas:
- Cómo crear una lista de instrucciones
- App Links Assistant en Android Studio
- Herramientas para desarrolladores de vínculos de aplicaciones