Как добавить расширенный интерфейс установки

Магазины приложений предоставляют разработчикам возможность продемонстрировать свои приложения перед установкой, используя скриншоты и текстовую информацию, которая помогает пользователю принять решение об установке приложения. Более удобный интерфейс установки предоставляет аналогичное пространство разработчикам веб-приложений, позволяя им приглашать пользователей установить приложение непосредственно из браузера. Этот улучшенный интерфейс доступен в Chrome для Android и настольных компьютеров.

Запрос по умолчанию

См. пример ниже, демонстрирующий стандартный интерфейс, который не предоставляет достаточного контекста.

Диалоговое окно установки по умолчанию в браузере для настольных компьютеров.
Диалог установки по умолчанию на рабочем столе


Диалоговое окно установки по умолчанию в браузере для мобильных устройств.
Диалог установки по умолчанию на мобильных устройствах

Более удобный интерфейс установки

Чтобы вместо стандартного небольшого диалогового окна установки отображалось расширенное диалоговое окно, добавьте в веб-манифест поля для screenshots и description . Пример можно посмотреть ниже на примере Squoosh.app:

Расширенные возможности установки на настольных компьютерах и мобильных устройствах.
Более удобный интерфейс установки на настольных компьютерах и мобильных устройствах.

Диалоговое окно Richer Install UI состоит из содержимого полей description и screenshots в веб-манифесте.

Для запуска диалогового окна достаточно добавить хотя бы один скриншот соответствующего форм-фактора, но рекомендуется также добавить описание. Подробную информацию об этих полях смотрите ниже.

Скриншоты

Скриншоты действительно делают новый интерфейс установки более функциональным, и мы настоятельно рекомендуем их использовать. В вашем манифесте добавьте член screenshots , который принимает массив, требующий как минимум одного изображения, и Chrome отобразит до восьми. Пример показан ниже.

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

Скриншоты должны соответствовать следующим критериям:

  • Ширина и высота должны составлять не менее 320 пикселей и не более 3840 пикселей.
  • Максимальный размер не может превышать минимальный размер более чем в 2,3 раза.
  • Все скриншоты с одинаковым форм-фактором должны иметь идентичные соотношения сторон .
  • Поддерживаются только форматы изображений JPEG и PNG.
  • Будет показано только восемь скриншотов. Если будет добавлено больше, пользовательский агент просто проигнорирует их.

Кроме того, для корректного отображения необходимо указать размер и тип изображения.

form_factor указывает браузеру, должен ли снимок экрана отображаться на настольных компьютерах ( wide ) или на мобильных устройствах ( narrow ).

Описание

В поле description содержится информация о приложении, которая предлагается пользователю сохранить приложение.

Диалоговое окно отобразится даже без description , но его наличие приветствуется. Максимальное количество строк текста (примерно 324 символа) ограничено 7 строками, более длинные описания обрезаются, и к ним добавляется многоточие.

{

"description": "Compress and compare images with different codecs
right in your browser."
}
Добавлено описание
Добавлено описание.
Более подробное описание, которое было сокращено.
Более длинные описания сокращаются.

Описание отображается в верхней части окна запроса на установку.

Как вы могли заметить на скриншотах, в диалоговых окнах установки также указывается источник приложения. Источники, слишком длинные для размещения на экране, обрезаются; это называется опущением и используется в качестве меры безопасности для защиты пользователей .

Дополнительная информация

Демо

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();
  });
}