Ограничения PWA и iOS

Урок честно перечисляет, чего PWA не умеет, с особым вниманием к ограничениям на iOS.

PWA мощны, но не всесильны: ряд возможностей платформ им недоступен, и сильнее всего ограничения проявляются на iOS.

Общие ограничения

PWA работают в песочнице браузера, поэтому у них нет полного доступа к устройству, как у нативных приложений. Типично недоступны или ограничены:

  • глубокая интеграция с системой (некоторые датчики, контакты, SMS, фоновые длительные задачи);
  • доступ к произвольным файлам вне выбранных пользователем;
  • тяжёлая работа в фоне без событий — браузер усыпляет Service Worker.

Многое из этого постепенно закрывается новыми Web API, но «догоняющим» темпом и неравномерно по браузерам.

Ограничения именно на iOS

Apple исторически поддерживала PWA сдержанно. Ключевые болевые точки на iPhone/iPad:

ВозможностьiOS (Safari)
Установка на домашний экранесть, но вручную (Поделиться → На экран Домой)
beforeinstallpromptнет — своей кнопки установки не сделать
Push-уведомленияпоявились поздно и только для установленных на домашний экран PWA
Background Syncнет
Лимиты хранилищажёстче; кеш может очищаться при нехватке места/долгом неиспользовании

Отдельная тонкость: на iOS все браузеры обязаны использовать движок Safari (WebKit), поэтому установить «Chrome с его возможностями» на iPhone не получится — ограничения системные.

Как работает под капотом усыпление воркера

Даже там, где Service Worker поддержан, нельзя рассчитывать на «вечный фон». Браузер запускает Service Worker под событие и через несколько десятков секунд бездействия выгружает его, чтобы экономить батарею и память. Поэтому длительные операции в Service Worker оборачивают в event.waitUntil() (чтобы воркер не усыпили посреди дела), а долгие фоновые сценарии строят на специальных API (Push, Background Sync), а не на «бесконечном цикле».

Как с этим жить

  • Прогрессивное улучшение. Стройте базовый функционал так, чтобы он работал везде, а платформенные бонусы добавляйте опционально.
  • Проверяйте поддержку. Перед использованием API проверяйте его наличие и давайте запасной путь.
  • Тестируйте на реальном iOS. Многие сюрпризы видны только на устройстве Apple.

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

  • Считать, что на iOS всё как в Chrome. Часть возможностей там отсутствует или работает иначе.
  • Делать ключевую функцию на API без фолбэка. На неподдерживающей платформе приложение сломается.
  • Рассчитывать на бесконечный фон. Service Worker усыпляется; используйте событийные API.

Итоги

  • PWA ограничены песочницей браузера: нет полного доступа к железу и длительного фона.
  • На iOS жёстче всего: ручная установка, нет beforeinstallprompt и Background Sync, лимиты хранилища.
  • Service Worker усыпляется — долгие задачи строят на Push/Sync, а не на цикле.
  • Спасает прогрессивное улучшение, проверка поддержки и тесты на реальном iOS.
Проверьте себя
1. Что из перечисленного НЕ поддерживается на iOS?
AУстановка на домашний экран вручную
BСобытие beforeinstallprompt и Background Sync
CКеширование через Cache API
DService Worker в целом
2. Почему нельзя рассчитывать на бесконечную работу Service Worker в фоне?
AЭто запрещено манифестом
BБраузер усыпляет Service Worker после короткого бездействия ради экономии батареи и памяти
CService Worker работает только онлайн
DФон отключает HTTPS