На сайте у вас уже есть валидный манифест и работающий service worker. Браузер автоматически предлагает установку — маленькой иконкой в адресной строке. Это работает, но на практике большинство пользователей этого предложения не замечают. Чтобы повысить процент установок, обычно делают свою кнопку с осмысленным текстом. Как именно — разберём в этой главе. Заодно посмотрим, как пользователь устанавливает PWA на разных платформах и как опубликовать приложение в магазинах.

Событие beforeinstallprompt

В Chrome и Edge (а также во всех Chromium-браузерах) есть специальное событие beforeinstallprompt. Браузер бросает его на странице, когда сам решил, что сайт пригоден для установки: есть HTTPS, манифест с минимальными полями, есть зарегистрированный service worker. Перехватив это событие, можно отложить системный диалог и показать пользователю свою кнопку:

let deferredPrompt;

window.addEventListener("beforeinstallprompt", (event) => {
  event.preventDefault();
  deferredPrompt = event;
  document.querySelector("#install-btn").hidden = false;
});

document.querySelector("#install-btn").addEventListener("click", async () => {
  if (!deferredPrompt) return;
  deferredPrompt.prompt();
  const { outcome } = await deferredPrompt.userChoice;
  console.log("Решение пользователя:", outcome); // "accepted" или "dismissed"
  deferredPrompt = null;
  document.querySelector("#install-btn").hidden = true;
});

Кнопка появляется только если браузер сам решил, что сайт можно установить. Если условия не выполнены — событие не выстрелит, и кнопка останется скрытой. Это удобно: один и тот же код безопасно работает и в браузерах, которые не поддерживают beforeinstallprompt (например, Safari).

После успешной установки браузер бросит ещё одно событие — appinstalled. Удобно использовать для аналитики:

window.addEventListener("appinstalled", () => {
  console.log("PWA установлено");
  // Отправить событие в аналитику
});

Установка на Android

На Android процесс выглядит так:

  1. Пользователь заходит на сайт через Chrome.
  2. Если manifest и service worker валидны, через несколько секунд в нижней части экрана появляется банер с предложением установить.
  3. Альтернативно — меню Chrome (три точки) → пункт «Добавить на главный экран».
  4. Иконка появляется на главном экране. Внутри Android PWA запускается через WebAPK — настоящий APK-пакет, который Chrome автоматически генерирует и устанавливает.

Из-за WebAPK PWA на Android неотличимо от нативного приложения в списке установленных. Оно отображается в системном меню «Приложения», может быть назначено обработчиком ссылок, переживает обновления Chrome.

Установка на iOS

На iPhone и iPad процесс другой и менее очевидный для пользователя:

  1. Открыть сайт в Safari (только в нём, в Chrome для iOS установить PWA нельзя — он использует движок Safari, но не предоставляет UI установки).
  2. Нажать кнопку «Поделиться» внизу.
  3. В появившемся меню — пункт «На экран «Домой»».
  4. Подтвердить — иконка появится на рабочем столе.

Никакого автоматического банера или предложения от Safari нет. Поэтому в PWA для iPhone-аудитории обычно делают видимую подсказку, объясняющую, как установить:

// Простая проверка: iOS и при этом не запущено как PWA
const isIos = /iPhone|iPad|iPod/.test(navigator.userAgent);
const isStandalone = window.matchMedia("(display-mode: standalone)").matches;

if (isIos && !isStandalone) {
  showIosInstallHint();
}

display-mode: standalone — CSS-медиа-запрос, по которому можно отличить запуск в обычной вкладке Safari от запуска уже установленного PWA.

Установка на десктопе

В Chrome и Edge на macOS, Windows и Linux установка работает почти как на Android — иконка установки появляется в правой части адресной строки. PWA после установки открывается в собственном окне без табов и адресной строки, появляется в меню «Приложения» ОС, может быть назначено обработчиком определённых URL.

В Safari на macOS установка PWA появилась с macOS Sonoma (14-я версия): кнопка «Add to Dock» в меню File. До этого PWA на macOS можно было только использовать в обычной вкладке.

Публикация в магазинах приложений

Хотя PWA не требует попадания в магазины, иногда оно туда нужно — для маркетинга, для пользователей, которые не знают про «Добавить на главный экран», или просто чтобы быть найденным в поиске Google Play.

Google Play через TWA

TWA (Trusted Web Activities) — механизм, который позволяет упаковать PWA как Android-приложение. Внутри APK сидит Chrome Custom Tab, который открывает ваш сайт в полноэкранном режиме. Для пользователя — неотличимо от нативного приложения.

Чтобы собрать TWA вручную, нужен Android Studio. Но проще через PWABuilder — это сайт pwabuilder.com, в который скармливают URL вашего PWA. Сервис проверяет манифест и service worker, потом выдаёт готовый APK для Google Play, MSIX для Microsoft Store и iOS-обёртку.

Сложность одна — Digital Asset Links. Чтобы Android доверял связке APK + домен, нужно положить на ваш сайт файл /.well-known/assetlinks.json с отпечатком подписи APK. Без этого пользователь увидит адресную строку браузера сверху, как в обычном Custom Tab. PWABuilder это объясняет в инструкции.

Microsoft Store

В Microsoft Store попадание самое простое: PWABuilder упаковывает PWA в MSIX, который принимается магазином почти автоматически. Microsoft активно продвигает PWA как первоклассный способ распространения приложений на Windows.

App Store

В Apple App Store PWA напрямую опубликовать нельзя. Apple не пускает приложения, которые не содержат собственного нативного кода. Через PWABuilder можно сгенерировать обёртку с WKWebView, но это уже не «чистая» PWA, и Apple такие приложения часто отклоняет по правилу «всего лишь обёртка вокруг сайта».

Практический подход для iOS — не публиковаться в App Store, а делать удобную инструкцию по установке на главный экран. PWA на iOS работает (с ограничениями), просто способ установки нестандартный.