Назад в блог
Для разработчиков9 мин

manifest.json для PWA: обязательные поля, пример и генератор

Что такое manifest.json (web app manifest), какие поля обязательны для установки PWA, как подключить файл и проверить его. Рабочий пример и онлайн-генератор.

manifest.json — это текстовый файл в формате JSON, в котором сайт сообщает браузеру своё название, иконки, адрес запуска, цвета и режим окна. Без манифеста сайт нельзя установить как PWA, а на iPhone он превратится в обычную закладку. Минимальный набор для установки в Chrome, Edge и Samsung Internet: название, иконки 192×192 и 512×512, start_url и display. Файл подключается одной строкой в head страницы, а собрать его можно в генераторе манифеста.

Формат описан в спецификации Web Application Manifest, а справочник по полям ведёт MDN. Ниже — как устроен файл, какие поля действительно нужны, как его подключить и чем отличается поведение на Android, компьютере и iPhone.

Что такое manifest.json и зачем он нужен

Манифест превращает сайт из набора страниц в «приложение» с собственной идентичностью. Браузер читает из него, как подписать иконку, какой адрес открыть при запуске, нужно ли прятать адресную строку и какой цвет показать на заставке. Именно манифест отвечает за то, что установленный сайт открывается в отдельном окне, а не во вкладке.

Название файла не принципиально: встречаются manifest.json и manifest.webmanifest. Важен не он, а то, что файл подключён через link rel="manifest" и отдаётся сервером как валидный JSON. Для расширения .webmanifest стандарт рекомендует тип application/manifest+json, но браузеры спокойно принимают и обычный application/json.

Минимальный манифест: что нужно для установки

По спецификации все поля манифеста необязательны, но для установки браузеры предъявляют свои требования. Для Chromium-браузеров (Google Chrome, Microsoft Edge, Samsung Internet) MDN перечисляет такой минимум (Making PWAs installable):

  • name или short_name — название приложения.
  • icons — среди иконок должны быть 192×192 и 512×512 пикселей.
  • start_url — адрес, с которого открывается приложение.
  • display и/или display_override — режим окна.
  • prefer_related_applications — либо false, либо поля нет вообще.

Ещё одно условие вне манифеста: страница должна открываться по HTTPS (для разработки допустимы localhost и 127.0.0.1). Service worker для установки не обязателен — MDN прямо отмечает, что он нужен лишь для офлайн-режима. Подробнее об этом в статье Service worker: что это и как проверить офлайн-режим.

Рабочий пример manifest.json

{
  "id": "/",
  "name": "Мои задачи",
  "short_name": "Задачи",
  "description": "Список дел, который работает без интернета",
  "lang": "ru",
  "start_url": "/?source=pwa",
  "scope": "/",
  "display": "standalone",
  "orientation": "portrait",
  "background_color": "#ffffff",
  "theme_color": "#1a73e8",
  "icons": [
    { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" },
    {
      "src": "/icons/icon-maskable-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ]
}

Подключите файл в head каждой страницы, которую можно установить. MDN подчёркивает: если у PWA несколько страниц, ссылка на манифест должна быть на каждой.

<link rel="manifest" href="/manifest.webmanifest">
<meta name="theme-color" content="#1a73e8">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon-180.png">

Основные поля манифеста

ПолеЧто задаётПрактический совет
nameПолное название: экран установки, заставкаДелайте понятным и уникальным; оно же показывается на splash-экране
short_nameКороткое название под иконкойДелайте короче: под иконкой мало места, длинная подпись обрежется
descriptionОписание приложенияВ Android его показывает окно установки вместе со скриншотами
start_urlЧто открывается при запускеОтносительный путь; он должен попадать в scope
scopeКакие адреса считаются частью приложенияСсылки за пределами scope откроются в обычном браузерном окне
idПостоянный идентификатор приложенияЗадайте явно, чтобы смена start_url не создавала «новое» приложение
displayРежим окна: fullscreen, standalone, minimal-ui, browserДля «приложения» обычно standalone
orientationПредпочтительная ориентацияУказывайте, только если интерфейс действительно не работает иначе
theme_colorЦвет оформления окна и панелиСовпадает с meta theme-color на странице
background_colorФон заставки до загрузкиБерите цвет фона вашего интерфейса
iconsИконки приложения192, 512 и maskable; подробности — в гайде по иконкам
screenshotsСкриншоты для окна установкиAndroid показывает их при наличии description
shortcutsБыстрые действия по долгому нажатию на иконкуДобавляйте 2–4 самых частых сценария

Режимы display и запасная цепочка

Если поле display не указано, используется browser — установленный сайт откроется как обычная вкладка. Режим standalone убирает адресную строку и даёт отдельное окно, fullscreen скрывает всё, включая строку состояния (удобно для игр), а minimal-ui оставляет минимальные элементы навигации. Если браузер не поддерживает выбранный режим, он перебирает цепочку fullscreen → standalone → minimal-ui → browser (MDN: display).

Поле display_override позволяет задать собственный порядок перебора режимов; значение display остаётся запасным вариантом для браузеров, которые это поле не знают.

start_url, scope и id: где чаще всего ошибаются

  • start_url вне scope. Если адрес запуска не входит в область, приложение откроется не там, где вы ожидаете. Проверьте, что start_url начинается с префикса scope.
  • Абсолютные пути без учёта подкаталога. Сайт в подпапке /app/ с start_url «/» будет запускаться с корня домена. Используйте пути относительно нужной папки.
  • Параметры отслеживания. Добавлять к start_url метку вроде ?source=pwa допустимо, но страница должна одинаково открываться с ней и без неё.
  • Смена id. Идентификатор нужен, чтобы браузер отличал приложение от других на том же домене. Если его не задать, он берётся из start_url; поменяв start_url, вы фактически создаёте новое приложение.

Манифест на iPhone: что учитывает Safari

Apple называет сайт веб-приложением «Домой», если в манифесте display равен standalone или fullscreen: тогда при запуске с иконки он открывается отдельно от Safari и появляется в переключателе приложений. Если манифеста с таким режимом нет (и нет мета-тега для веб-приложения), сайт сохраняется как закладка, которая с iOS 16.4 открывается в браузере по умолчанию (WebKit).

  • Иконки из манифеста iOS поддерживает с версии 15.4. Если указаны и manifest icons, и apple-touch-icon, приоритет у apple-touch-icon.
  • С iOS 16.4 поддерживаются поле id (оно синхронизирует настройки «Фокусирования» между устройствами) и push-уведомления для веб-приложений на экране «Домой».
  • Если иконки нет вообще, iOS создаст монограмму из первой буквы названия.
  • Пользователь может переименовать приложение при добавлении, и один сайт можно добавить на экран несколько раз.

Как добавить сайт на iPhone и что делать, если пункта нет в меню, разобрано в статьях Как добавить сайт на экран «Домой» и Нет кнопки «На экран Домой» на iPhone.

Как собрать манифест в генераторе

01

Заполните основные поля

Откройте генератор манифеста и введите название, короткое название, описание, start_url и scope.

02

Выберите режим и цвета

Укажите display (обычно standalone), ориентацию, theme_color и background_color. JSON в окне предпросмотра обновляется сразу.

03

Скачайте файл

Генератор работает в браузере: данные формы не отправляются на сервер. Сохраните manifest.webmanifest и положите его в корень сайта.

04

Добавьте иконки

В файле прописаны пути icon-192.png, icon-512.png и icon-maskable-512.png — создайте эти файлы или поправьте пути под свою структуру.

Что в готовом файле генератора

Генератор подставляет id, равный start_url, и три иконки: 192×192, 512×512 и maskable 512×512. Размеры и требования к самим картинкам — в статье Иконки PWA: размеры и maskable.

Как проверить манифест

  1. Откройте сайт в Chrome, нажмите F12 и перейдите на вкладку «Application» → «Manifest». DevTools покажет разобранные поля, иконки и предупреждения (документация Chrome).
  2. Запустите PWA-чекер или просмотр манифеста для публичного адреса: инструмент найдёт файл и покажет, что в нём не так.
  3. Проверьте установку на реальном устройстве: на Android — пункт «Установить приложение» в меню Chrome, на iPhone — «Поделиться» → «На экран „Домой“».
  4. Если сайт планируется упаковать в Android-приложение, пройдите проверку готовности APK.

Частые ошибки

СимптомВероятная причинаЧто сделать
Нет кнопки «Установить»Нет иконок 192 и 512, не задан start_url или displayДобавьте недостающие поля, проверьте вкладку Manifest в DevTools
Манифест «не найден»Нет тега link rel="manifest" или неверный путьОткройте адрес файла в браузере: должен показаться JSON
Ошибка разбора JSONЛишняя запятая, одинарные кавычки, комментарииПроверьте файл валидатором JSON
Иконка с белой рамкой на AndroidНет maskable-иконкиДобавьте иконку с purpose maskable
Приложение открывается во вкладкеdisplay равен browser или не указанПоставьте standalone
На iPhone нет иконки сайтаНет apple-touch-icon и подходящих иконок в манифестеДобавьте apple-touch-icon 180×180
Страницы не открываются внутри приложенияСсылки выходят за scopeРасширьте scope или оставьте внешние ссылки как есть

Если вы не разработчик и хотите просто поставить готовое приложение, посмотрите каталог PWA и инструкцию Как установить PWA. Общую картину даёт статья Что такое PWA.

ВОПРОСЫ И ОТВЕТЫ

Частые вопросы

Чем отличается manifest.json от manifest.webmanifest?

Содержимое одинаковое, различается только имя файла. Для .webmanifest стандарт рекомендует тип application/manifest+json. Важно подключить файл тегом link rel="manifest" и отдавать его как корректный JSON.

Какие поля манифеста обязательны для установки PWA?

Для Chromium-браузеров нужны название (name или short_name), иконки 192×192 и 512×512, start_url и display (или display_override). Поле prefer_related_applications должно быть false или отсутствовать, а страница должна открываться по HTTPS.

Нужен ли service worker, чтобы манифест заработал?

Для установки в современных браузерах service worker не обязателен: MDN указывает, что он нужен для офлайн-режима, а не для самой установки. Но без него приложение не откроется без сети.

Работает ли манифест на iPhone?

Да. Safari использует display (standalone или fullscreen превращают сайт в веб-приложение «Домой»), название и иконки; иконки из манифеста поддерживаются с iOS 15.4, а apple-touch-icon при наличии имеет приоритет.

Где положить файл манифеста?

Обычно в корень сайта: /manifest.webmanifest. Главное, чтобы путь в теге link совпадал с реальным адресом, а scope охватывал страницы приложения.

Как быстро создать манифест без ручной правки JSON?

Воспользуйтесь бесплатным генератором манифеста на PWAs.app: он собирает JSON в браузере, показывает предпросмотр и отдаёт готовый файл manifest.webmanifest.