Cómo agregar una IU de instalación más completa

Las tiendas de aplicaciones ofrecen un espacio para que los desarrolladores muestren sus apps antes de la instalación, con información de texto y capturas de pantalla que ayudan al usuario a tomar la decisión de instalar la app. Una IU de instalación más enriquecida ofrece un espacio similar para que los desarrolladores de apps web inviten a sus usuarios a instalar la app directamente desde el navegador. Esta IU mejorada está disponible en Chrome para entornos de escritorio y Android.

Mensaje predeterminado

Consulta el siguiente ejemplo para ver la experiencia predeterminada, que no proporciona suficiente contexto.

Diálogo de instalación predeterminado del navegador para computadoras de escritorio.
Diálogo de instalación predeterminado en computadoras de escritorio


Diálogo de instalación predeterminado del navegador para dispositivos móviles
Diálogo de instalación predeterminado en dispositivos móviles

IU de instalación más enriquecida

Para obtener el diálogo de la IU de instalación más enriquecida en lugar del pequeño mensaje predeterminado común, agrega los campos screenshots y description a tu manifiesto web. Consulta el siguiente ejemplo de Squoosh.app:

IU de instalación más enriquecida en computadoras y dispositivos móviles
IU de instalación más completa para computadoras y dispositivos móviles.

El diálogo de la IU de instalación más completa se compone del contenido de los campos description y screenshots en el manifiesto web.

Para activar el diálogo, solo debes agregar al menos una captura de pantalla con el factor de forma correspondiente, pero también se recomienda agregar la descripción. Consulta los detalles específicos de esos campos a continuación.

Capturas de pantalla

Las capturas de pantalla realmente agregan la parte "más enriquecida" a la nueva IU de instalación, y recomendamos enfáticamente su uso. En el manifiesto, agrega el miembro screenshots, que toma un array que requiere al menos una imagen, y Chrome mostrará hasta ocho. A continuación, se muestra un ejemplo.

 "screenshots": [
    {
     "src": "source/image1.gif",
      "sizes": "640x320",
      "type": "image/gif",
      "form_factor": "wide",
      "label": "Wonder Widgets"
    }
]

Las capturas de pantalla deben cumplir con los siguientes criterios:

  • El ancho y la altura deben ser de 320 píxeles como mínimo y 3,840 píxeles como máximo.
  • La dimensión máxima no puede superar la dimensión mínima en más de 2.3 veces.
  • Todas las capturas de pantalla con el mismo factor de forma deben tener relaciones de aspecto idénticas.
  • Solo se admiten los formatos de imagen JPEG y PNG.
  • Solo se mostrarán ocho capturas de pantalla. Si se agregan más, el usuario-agente simplemente los ignora.

Además, debes incluir el tamaño y el tipo de imagen para que se renderice correctamente. Mira esta demostración.

El símbolo form_factor le indica al navegador si la captura de pantalla debe aparecer en entornos de computadoras de escritorio (wide) o dispositivos móviles (narrow).

Descripción

El miembro de description describe la aplicación en el mensaje de instalación para invitar al usuario a mantenerla.

El diálogo se mostraría incluso sin un description, pero es recomendable hacerlo. Hay un máximo que aparece después de 7 líneas de texto (aproximadamente 324 caracteres), las descripciones más largas se truncan y se agregan puntos suspensivos (como puedes ver en este ejemplo).

{
…
"description": "Compress and compare images with different codecs
right in your browser."
}
Se agregó la descripción
Se agregó la descripción.
Una descripción más larga que se truncó.
Las descripciones más largas se truncan.

La descripción aparece en la parte superior de la solicitud de instalación.

En las capturas de pantalla, quizás hayas notado que los diálogos de instalación también muestran el origen de la app. Los orígenes que son demasiado largos para adaptarse a la IU se truncan, lo que también se conoce como omisión y se usa como medida de seguridad para proteger a los usuarios.

Lecturas adicionales

Demostración

HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="color-scheme" content="dark light" />
    <link rel="manifest" href="manifest.json" />
    <title>How to add Richer Install UI to your web app</title>
    <!-- TODO: Devsite - Removed inline handlers -->
    <!-- <script>
      if ('serviceWorker' in navigator) {
        window.addEventListener('load', () => {
          navigator.serviceWorker.register('sw.js');
        });
      }
    </script>
    <script type="module" src="script.js"></script> -->
  </head>
  <body>
    <h1>How to add Richer Install UI to your web app</h1>
    <ol>
      <li>
        Install the app by clicking the button below. After the installation,
        the button is disabled.
        <p>
          <button disabled type="button">Install</button>
        </p>
      </li>
      <li>
        When you click on install a dialog similar to the ones from app stores
        will be displayed.
      </li>
      <li>
        The dialog includes the `description` and `screenshots` set in the app
        manifest.
      </li>
      <li>
        Screenshots should be different depending if the app is being installed
        on a mobile or desktop device, according to the `form_factor` value set
        for the screenshots on the manifest
      </li>
    </ol>
  </body>
</html>

JS


        // The install button.
const installButton = document.querySelector('button');

// Only relevant for browsers that support installation.
if ('BeforeInstallPromptEvent' in window) {
  // Variable to stash the `BeforeInstallPromptEvent`.
  let installEvent = null;

  // Function that will be run when the app is installed.
  const onInstall = () => {
    // Disable the install button.
    installButton.disabled = true;
    // No longer needed.
    installEvent = null;
  };

  window.addEventListener('beforeinstallprompt', (event) => {
    // Do not show the install prompt quite yet.
    event.preventDefault();
    // Stash the `BeforeInstallPromptEvent` for later.
    installEvent = event;
    // Enable the install button.
    installButton.disabled = false;
  });

  installButton.addEventListener('click', async () => {
    // If there is no stashed `BeforeInstallPromptEvent`, return.
    if (!installEvent) {
      return;
    }
    // Use the stashed `BeforeInstallPromptEvent` to prompt the user.
    installEvent.prompt();
    const result = await installEvent.userChoice;
    // If the user installs the app, run `onInstall()`.
    if (result.outcome === 'accepted') {
      onInstall();
    }
  });

  // The user can decide to ignore the install button
  // and just use the browser prompt directly. In this case
  // likewise run `onInstall()`.
  window.addEventListener('appinstalled', () => {
    onInstall();
  });
}