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, а браузер не пропонує встановлення? Перевірте консоль: швидше за все, помилка маніфесту. Правильне налаштування PWA-маніфесту — дрібниця, але саме вона в 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 збільшує шанс встановлення на 40% порівняно з помилковим.

Повний 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": "uk",
    "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 на пристроях.

Типові помилки та перевірка

Проблеми на iOS

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

Інструменти перевірки

Ми використовуємо три інструменти: 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 робочих днів. Вартість розраховується індивідуально: базовий пакет — від 2000 грн, комплексний — від 5000 грн. Економія на розробці нативного додатку може сягати 50–70%. Замовте налаштування 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. Зв'яжіться з нами для консультації — ми безкоштовно оцінимо ваш проект та запропонуємо оптимальну стратегію впровадження.

Посилання для поглибленого вивчення