PWA Manifest: настройка, проверка и установка на iOS/Android с примерами

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
PWA Manifest: настройка, проверка и установка на iOS/Android с примерами
Простой
от 4 часов до 2 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Вы запускаете PWA, а браузер не предлагает установку? Проверьте консоль: скорее всего, ошибка манифеста. Настройка Web App Manifest — кажущаяся мелочь, но именно она в 80% случаев блокирует событие beforeinstallprompt. Мы видели проекты, где отсутствовали maskable-иконки, неправильно выставлен display_override или забыты iOS-метатеги. В результате пользователь не получает иконку на рабочий стол, а конверсия падает на 30–40%. Разберём, как сделать так, чтобы приложение устанавливалось на Android, iOS и десктоп без лишних танцев с бубном.

Почему пользователи не видят кнопку установки?

Основные причины: отсутствие манифеста, невалидный JSON, неподходящие иконки (размер или тип), неправильный display (например, browser вместо standalone), отсутствие Service Worker, не HTTPS. Но чаще всего — несоответствие иконок требованиям: на Android нужны маскируемые иконки с purpose: maskable, на iOS — apple-touch-icon. Без них браузер просто не предлагает установку. Мы систематизируем ошибки и предлагаем готовые решения.

Полный manifest.json

{
    "name": "ТехноМагазин — купить электронику онлайн",
    "short_name": "ТехноМагазин",
    "description": "Смартфоны, ноутбуки, аксессуары. Быстрая доставка по России.",
    "start_url": "/?utm_source=pwa&utm_medium=manifest",
    "scope": "/",
    "display": "standalone",
    "display_override": ["window-controls-overlay", "standalone"],
    "orientation": "any",
    "theme_color": "#1a73e8",
    "background_color": "#ffffff",
    "lang": "ru",
    "dir": "ltr",
    "categories": ["shopping", "lifestyle"],
    "icons": [
        {
            "src": "/icons/icon-192.png",
            "sizes": "192x192",
            "type": "image/png",
            "purpose": "any"
        },
        {
            "src": "/icons/icon-192-maskable.png",
            "sizes": "192x192",
            "type": "image/png",
            "purpose": "maskable"
        },
        {
            "src": "/icons/icon-512.png",
            "sizes": "512x512",
            "type": "image/png",
            "purpose": "any"
        },
        {
            "src": "/icons/icon-512-maskable.png",
            "sizes": "512x512",
            "type": "image/png",
            "purpose": "maskable"
        }
    ],
    "screenshots": [
        {
            "src": "/screenshots/catalog-mobile.webp",
            "sizes": "390x844",
            "type": "image/webp",
            "form_factor": "narrow",
            "label": "Каталог товаров"
        },
        {
            "src": "/screenshots/product-mobile.webp",
            "sizes": "390x844",
            "type": "image/webp",
            "form_factor": "narrow",
            "label": "Карточка товара"
        },
        {
            "src": "/screenshots/catalog-desktop.webp",
            "sizes": "1280x800",
            "type": "image/webp",
            "form_factor": "wide",
            "label": "Каталог — десктоп"
        }
    ],
    "shortcuts": [
        {
            "name": "Корзина",
            "short_name": "Корзина",
            "url": "/cart?utm_source=pwa",
            "icons": [{ "src": "/icons/cart-96.png", "sizes": "96x96", "type": "image/png" }]
        },
        {
            "name": "Поиск",
            "short_name": "Поиск",
            "url": "/search?utm_source=pwa",
            "icons": [{ "src": "/icons/search-96.png", "sizes": "96x96", "type": "image/png" }]
        }
    ],
    "protocol_handlers": [
        {
            "protocol": "web+technoshop",
            "url": "/products?q=%s"
        }
    ]
}

Подключение в HTML

<head>
    <link rel="manifest" href="/manifest.json">

    <!-- iOS — Safari не читает manifest для этих параметров -->
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="apple-mobile-web-app-title" content="ТехноМагазин">

    <!-- iOS иконки -->
    <link rel="apple-touch-icon" href="/icons/apple-touch-icon-180.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/icons/apple-touch-icon-152.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/icons/apple-touch-icon-120.png">

    <!-- Splash screens iOS (опционально) -->
    <link rel="apple-touch-startup-image"
          media="(device-width: 390px) and (device-height: 844px)"
          href="/splashscreens/iphone12.png">

    <!-- Windows tile -->
    <meta name="msapplication-TileColor" content="#1a73e8">
    <meta name="msapplication-TileImage" content="/icons/icon-144.png">
    <meta name="theme-color" content="#1a73e8">
</head>

Сравнение поддержки Android и iOS

Поле manifest Android (Chrome) iOS (Safari)
display Поддерживается (standalone, fullscreen) Игнорируется
icons Поддерживаются все размеры Только apple-touch-icon
shortcuts Поддерживаются Не поддерживаются
screenshots Поддерживаются (для установки) Не поддерживаются
scope Поддерживается Игнорируется

Режимы display

Значение Описание
browser Обычная вкладка браузера
minimal-ui Минимальные элементы навигации
standalone Без адресной строки, как нативное приложение
fullscreen Полный экран без UI браузера

display_override — массив с приоритетом: браузер выберет первый поддерживаемый. window-controls-overlay — для Desktop PWA показывает кастомный titlebar.

Maskable-иконка

Maskable-иконка адаптируется под форму (круг, квадрат, squircle) на разных устройствах. Контент должен находиться в безопасной зоне — центральный круг радиусом 80% от размера. Мы используем библиотеку sharp для генерации таких иконок с правильным отступом. Без maskable иконка может обрезаться на Android и Windows, что портит впечатление пользователя при установке.

Как проверить maskable-иконку Загрузите иконку на maskable.app — он покажет, как она будет выглядеть на разных устройствах. Если контент выходит за безопасную зону, увеличьте отступы.

Динамический manifest для мультиязычного сайта

// routes/web.php
Route::get('/manifest.json', [ManifestController::class, 'index']);

// ManifestController.php
public function index(Request $request): JsonResponse
{
    $locale = app()->getLocale();
    $manifest = [
        'name'             => __('pwa.name'),
        'short_name'       => __('pwa.short_name'),
        'description'      => __('pwa.description'),
        'start_url'        => "/?lang={$locale}&utm_source=pwa",
        'lang'             => $locale,
        'theme_color'      => '#1a73e8',
        'background_color' => '#ffffff',
        'display'          => 'standalone',
        'scope'            => '/',
        'icons'            => $this->getIcons(),
        'shortcuts'        => $this->getShortcuts($locale),
    ];

    return response()->json($manifest)
        ->header('Content-Type', 'application/manifest+json');
}

Проверка

  • Chrome DevTools → Application → Manifest — все поля, иконки, устанавливаемость
  • Lighthouse → PWA — проверить все требования
  • PWABuilder — полный аудит и генерация пакетов для App Store

Используйте документацию MDN для проверки спецификации.

Согласно спецификации W3C, Web App Manifest — стандарт для определения внешнего вида PWA на устройствах.

Почему manifest не работает на iOS?

Safari игнорирует поле display и некоторые другие. Решение — добавить перечисленные выше мета-теги и apple-touch-icon. Без них PWA на iPhone будет открываться в Safari, а не как отдельное приложение. Также убедитесь, что start_url корректен и ведёт на защищённую страницу (HTTPS).

Как проверить корректность manifest перед деплоем?

Мы используем три инструмента: Chrome DevTools для быстрой проверки, Lighthouse для полного PWA-аудита и PWABuilder для финальной верификации. PWABuilder генерирует ещё и пакеты для Google Play и App Store, если нужно публиковать PWA в магазинах. По нашему опыту, около 80% проблем с установкой решаются правильным manifest.

Что входит в работу

  • Аудит текущего manifest (если есть)
  • Генерация иконок всех размеров, включая maskable (192, 512, 96, 144, 180)
  • Настройка shortcuts и screenshots для разных устройств
  • Вёрстка мета-тегов для iOS и Windows
  • Проверка через Lighthouse и PWABuilder
  • Предоставление готового manifest.json и документации по обновлению

Процесс работы

  1. Анализ требований (аудитория, устройства, мультиязычность)
  2. Проектирование manifest (набор полей, структура иконок)
  3. Реализация (генерация иконок, написание manifest, интеграция в HTML)
  4. Тестирование на реальных устройствах (Android, iOS, Windows)
  5. Деплой и мониторинг установок

Сроки ориентировочно

Базовая настройка — от 4 до 8 часов. Комплексный проект с мультиязычностью и множеством иконок — до 2 рабочих дней. Стоимость рассчитывается индивидуально: зависит от количества локализаций и необходимости интеграции с системой управления контентом. Закажите настройку PWA-манифеста у нас — получите готовый JSON и иконки за 4 часа. Свяжитесь с нами, чтобы обсудить ваш проект и получить предварительную оценку — расскажем, как оптимизировать установку и повысить конверсию.

Наши инженеры имеют 5+ лет опыта в PWA, сертификаты по веб-производительности и за плечами более 50 проектов.

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

PWA превращает сайт в надёжное приложение, которое работает даже в офлайне, отправляет push-уведомления и устанавливается на главный экран. Разработка PWA приложений — это внедрение Service Worker, настройка кэш-стратегий и интеграция Web Push. В отличие от нативных приложений, вам не нужны две команды под iOS и Android — один код работает во всех современных браузерах. Закажите аудит вашего проекта на PWA-совместимость — мы бесплатно оценим потенциал и сроки.

Как Service Worker управляет сетевыми запросами?

Service Worker — это JavaScript-прокси между браузером и сетью. Работает в отдельном потоке, перехватывает запросы и решает, откуда их отдавать: из кэша, из сети или комбинацией. Разберём три базовые стратегии на реальных сценариях.

Стратегия кэширования Использование Поведение при офлайн
Cache First статика (CSS/JS с content hash) отдаётся из кэша, мгновенно
Network First API, заказы, новости сначала сеть, при ошибке — кэш
Stale While Revalidate контент соцсетей, лента страниц сразу кэш, потом обновление

Cache First применяется для ассетов с хешем в имени — файл никогда не изменится, можно кэшировать навсегда. Stale While Revalidate оптимальна для контента, где допустима небольшая задержка актуализации. Workbox от Google автоматизирует версионирование кэша и инвалидацию — без него корректный Service Worker потребует 300+ строк кода с нетривиальными edge cases. Vite + vite-plugin-pwa генерирует Service Worker из конфига, включая precaching статики.

import { VitePWA } from 'vite-plugin-pwa';
export default {
  plugins: [
    VitePWA({
      registerType: 'autoUpdate',
      includeAssets: ['favicon.ico'],
      manifest: { /* name, icons, start_url, display */ },
      workbox: {
        globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
        runtimeCaching: [
          { urlPattern: /^https?:\/\/api\./,
            handler: 'NetworkFirst',
            options: { cacheName: 'api-cache' }
          }
        ]
      }
    })
  ]
};

Как офлайн-режим реализуется на практике?

«Работает офлайн» для разных продуктов означает разное. Вот три типовых сценария.

  • Офлайн-чтение (новостные сайты, документация): Service Worker кэширует страницы при первом визите, стратегия Stale While Revalidate + Background Sync для синхронизации после восстановления соединения.
  • Офлайн-редактирование (заметки, задачи): IndexedDB хранит локальные данные, Background Sync API ставит операции в очередь — браузер синхронизирует сам, даже если вкладка закрыта. Ограничение: Background Sync поддерживается только в Chromium.
  • Офлайн-форма: пользователь нажал «Отправить» без интернета — данные не теряются, а ставятся в очередь и отправляются автоматически. Для медицинских и страховых форм это критично.

Проблема, о которой часто забывают: конфликты при синхронизации. Если пользователь А редактировал запись офлайн, а пользователь Б изменил её онлайн — нужна стратегия разрешения (last-write-wins, three-way merge или показ конфликта пользователю). Мы прорабатываем эти сценарии на этапе проектирования.

Как работают Web Push-уведомления?

Web Push доставляет сообщения через браузер + Push Service (FCM для Chrome/Edge, APNs для Safari). Пользователь даёт разрешение → браузер подписывается на Push Service → вы получаете endpoint и ключи → отправляете сообщение → Push Service доставляет в браузер. Реализация через библиотеку web-push (Node.js) или аналог для вашего бэкенда. VAPID-ключи генерируются один раз, подписка хранится в базе данных.

На текущий момент iOS (начиная с версии 16.4) поддерживает Web Push только для установленных PWA, Chrome/Firefox/Edge — полная поддержка без установки. Частота и релевантность уведомлений напрямую влияют на отток подписчиков — A/B тестирование времени отправки и формулировок стандартная практика.

Почему стоит выбрать PWA вместо нативных приложений?

Экономия на разработке под две платформы — до 60% бюджета. Один код, единая бизнес-логика, автоматическое обновление без магазинов. Мы выполнили более 30 PWA-проектов для e-commerce, финтеха и корпоративных систем — гарантируем совместимость с последними версиями браузеров и отличные показатели Core Web Vitals (LCP, CLS, INP). PWA увеличивает конверсию в среднем на 36% (данные Google). Сертифицированные специалисты с опытом 7+ лет в веб-разработке.

Что входит в разработку PWA под ключ?

Этап Результат Срок
Аудит текущего приложения Отчёт PWA‑score, рекомендации 1–2 дня
Проектирование офлайн‑сценариев Документация, прототип 2–3 дня
Разработка Service Worker + манифест Код, автоматическое тестирование 5–10 дней
Интеграция Web Push (опционально) Бэкенд‑ендпоинт, подписка 3–5 дней
Тестирование на реальных устройствах Отчёт, правки 3–5 дней
Деплой и документация Доступы, инструкция, гарантия 1 месяц 1–2 дня

App Shell архитектура и precaching критических ресурсов при первой установке дают мгновенную загрузку оболочки приложения даже при медленном соединении.

Процесс работы и сроки

  1. Аудит текущего приложения (Lighthouse PWA score, анализ сценариев).
  2. Определение ценных офлайн-сценариев.
  3. Настройка Service Worker через Workbox и реализация манифеста.
  4. Интеграция Web Push (если требуется).
  5. Тестирование на реальных устройствах — Chrome DevTools, Safari Web Inspector.
  6. Деплой, документация, обучение команды.

Ориентировочные сроки: базовая PWA (манифест + Service Worker + кэш статики) — 1–2 недели поверх готового приложения; Web Push — 1–2 недели; офлайн-редактирование с IndexedDB и Background Sync — 3–6 недель в зависимости от сложности данных.

Стоимость рассчитывается индивидуально после аудита. PWA-проект обычно обходится в 2–3 раза дешевле нативного приложения под обе платформы. Дополнительную экономию даёт отсутствие затрат на публикацию в App Store и Google Play. Свяжитесь с нами для консультации — мы бесплатно оценим ваш проект и предложим оптимальную стратегию внедрения.

Ссылки для углублённого изучения