Introducción
He utilizado el JavaScript de esta respuesta de Karl, pero me di cuenta de que la aplicación instalada usaría un favicon rudimentario, en lugar de los iconos más bonitos definidos en el manifiesto original.
He adaptado el script para actualizar el manifiesto original, en lugar de crear uno nuevo.
Edición del 11.01.2024 basada en la sugerencia y respuesta de Jason: Mantener los parámetros de búsqueda de la URL de inicio, tener en cuenta el hash de ubicación, establecer el ámbito de navegación y evitar romper los caminos absolutos de los iconos.
Personalización
Para cambiar la URL de inicio y otros detalles, podemos hacer que el navegador use nuestro propio manifiesto personalizado:
- Abre el sitio web y ve a la URL deseada. Si no es posible, ajusta la URL en el script.
- Abre la pestaña de consola en las herramientas para desarrolladores, en Chrome o Edge: Ctrl + Shift + I.
- Copia el JavaScript a continuación en la consola y presiona Enter.
- Cierra la consola y añade una aplicación, Menú > Aplicaciones > Instalar este sitio como una aplicación.
Personalizar el manifiesto original mantiene los iconos y otros detalles que no queremos cambiar.
El script
manifest = document.head.querySelector('link[rel="manifest"]');
json = await fetch(manifest.href).then(res => res.json());
url = new URL(window.location);
url.search = new URLSearchParams([...new URL(json.start_url, url).searchParams, ...url.searchParams]);
json.start_url = url.href;
json.scope = url.origin + url.pathname.substring(0, url.pathname.lastIndexOf('/') + 1);
json.icons.forEach((icon) => icon.src = new URL(icon.src, manifest.href).href);
manifest.href = 'data:application/manifest+json,' + encodeURIComponent(JSON.stringify(json));
json;
Con comentarios
// Encuentra el nodo head que enlaza con el manifiesto original.
manifest = document.head.querySelector('link[rel="manifest"]');
// Obtiene el manifiesto y lo convierte a json.
json = await fetch(manifest.href).then(res => res.json());
// Crea una nueva URL para la ubicación actual, manteniendo los parámetros de la URL de inicio original.
url = new URL(window.location);
url.search = new URLSearchParams([...new URL(json.start_url, url).searchParams, ...url.searchParams]);
// Establece la URL de inicio y el ámbito. Volverá a ser un navegador normal al navegar fuera del ámbito.
json.start_url = url.href;
json.scope = url.origin + url.pathname.substring(0, url.pathname.lastIndexOf('/') + 1);
// Convierte los caminos de iconos relativos en el manifiesto en caminos absolutos.
// Cuando el manifiesto está definido en línea, los caminos deben ser absolutos e incluir el protocolo.
json.icons.forEach((icon) => icon.src = new URL(icon.src, manifest.href).href);
// Almacena el manifiesto actualizado en línea en el nodo de enlace original.
// Debe estar codificado en URI, de lo contrario el # en los colores causaría errores de análisis.
manifest.href = 'data:application/manifest+json,' + encodeURIComponent(JSON.stringify(json));
// Muestra el manifiesto actualizado en la consola para su revisión.
json;
0 votos
Vi la solución de Karl. Me pregunto si hay una más simple...