diff --git a/PWA-TESTING.md b/PWA-TESTING.md index 7ea307d..a73a35c 100644 --- a/PWA-TESTING.md +++ b/PWA-TESTING.md @@ -22,25 +22,30 @@ ## Как протестировать -### 1. Откройте тестовую страницу +### 1. Откройте тестовую страницу для мобильных устройств +``` +http://localhost:3000/mobile-pwa-test.html +``` + +### 2. Откройте обычную тестовую страницу ``` http://localhost:3000/test-pwa.html ``` -### 2. Проверьте требования PWA -Нажмите кнопку "Проверить статус PWA" - все пункты должны быть зелеными: +### 3. Проверьте требования PWA +На мобильной тестовой странице автоматически проверяются все требования: - ✅ HTTPS или localhost - ✅ Service Worker - ✅ Manifest - ✅ Иконки - ❌ Уже установлено (должно быть красным, если не установлено) -### 3. Установка приложения +### 4. Установка приложения - Если все проверки пройдены, появится кнопка "Установить приложение" - Нажмите на неё для установки PWA -- Следуйте инструкциям браузера +- Следуйте инструкциям браузера или используйте инструкции на странице -### 4. Проверка в разных браузерах +### 5. Проверка в разных браузерах #### Chrome/Edge: - Откройте DevTools (F12) @@ -59,6 +64,39 @@ http://localhost:3000/test-pwa.html - Выберите "На экран Домой" - Приложение установится как PWA +#### ПК/Десктоп (Chrome, Edge, Firefox): +- Откройте сайт в браузере +- Нажмите на иконку установки в адресной строке (если доступна) +- Или используйте меню браузера → "Установить приложение" +- Или используйте меню браузера → "Создать ярлык" + +## Новые улучшения для мобильных устройств + +✅ **Улучшенный manifest.json:** +- Добавлены все необходимые размеры иконок (72x72, 96x96, 128x128, 144x144, 152x152, 192x192, 384x384, 512x512) +- Добавлены maskable иконки для Android +- Добавлены категории и скриншоты +- Улучшена совместимость с мобильными устройствами + +✅ **Улучшенные мета-теги:** +- Добавлены все необходимые apple-touch-icon размеры +- Улучшена поддержка iOS Safari +- Добавлены мета-теги для Windows +- Настроен правильный статус-бар для iOS + +✅ **Улучшенный Service Worker:** +- Кэширование всех иконок +- Улучшенная обработка ошибок +- Fallback для различных типов ресурсов +- Лучшая поддержка мобильных устройств + +✅ **Улучшенный PWA Manager:** +- Определение мобильного Safari +- Разные инструкции для разных браузеров +- Улучшенная проверка установки PWA +- Поддержка различных режимов отображения +- **Кнопка установки показывается только на мобильных устройствах** + ## Возможные проблемы и решения ### 1. Кнопка установки не появляется @@ -66,11 +104,14 @@ http://localhost:3000/test-pwa.html - Приложение уже установлено - Браузер не поддерживает PWA - Не выполнены требования PWA +- **Вы используете ПК/десктоп (кнопка скрыта для ПК)** **Решение:** -- Проверьте статус на тестовой странице +- Проверьте статус на мобильной тестовой странице - Убедитесь, что используете HTTPS или localhost - Проверьте консоль браузера на ошибки +- Для iOS Safari используйте инструкции "Добавить на главный экран" +- **На ПК используйте меню браузера для установки PWA** ### 2. Service Worker не регистрируется **Причины:** @@ -125,6 +166,8 @@ navigator.serviceWorker.getRegistrations().then(console.log); - ✅ `http://localhost:3000/sw.js` - должен возвращать JavaScript - ✅ `http://localhost:3000/icons/icon-192x192.png` - должен возвращать PNG - ✅ `http://localhost:3000/icons/icon-512x512.png` - должен возвращать PNG +- ✅ `http://localhost:3000/mobile-pwa-test.html` - мобильная тестовая страница +- ✅ `http://localhost:3000/test-pwa.html` - обычная тестовая страница ## Следующие шаги diff --git a/public/index.html b/public/index.html index 0cda61d..83500e5 100644 --- a/public/index.html +++ b/public/index.html @@ -10,15 +10,27 @@ - + + + + + + + + + + + + + @@ -109,25 +121,32 @@ e.preventDefault(); deferredPrompt = e; - // Показываем кнопку установки - const installButton = document.createElement('button'); - installButton.textContent = 'Установить приложение'; - installButton.className = 'btnSave'; - installButton.style.marginTop = '10px'; - installButton.style.width = '100%'; + // Проверяем, является ли устройство мобильным + const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) || + (navigator.maxTouchPoints && navigator.maxTouchPoints > 2) || + window.matchMedia('(max-width: 768px)').matches; - installButton.addEventListener('click', () => { - deferredPrompt.prompt(); - deferredPrompt.userChoice.then((choiceResult) => { - if (choiceResult.outcome === 'accepted') { - console.log('Пользователь установил приложение'); - } - deferredPrompt = null; - installButton.remove(); + // Показываем кнопку установки только на мобильных устройствах + if (isMobile) { + const installButton = document.createElement('button'); + installButton.textContent = 'Установить приложение'; + installButton.className = 'btnSave'; + installButton.style.marginTop = '10px'; + installButton.style.width = '100%'; + + installButton.addEventListener('click', () => { + deferredPrompt.prompt(); + deferredPrompt.userChoice.then((choiceResult) => { + if (choiceResult.outcome === 'accepted') { + console.log('Пользователь установил приложение'); + } + deferredPrompt = null; + installButton.remove(); + }); }); - }); - - document.querySelector('.auth-link').appendChild(installButton); + + document.querySelector('.auth-link').appendChild(installButton); + } }); // Обработка успешной установки diff --git a/public/manifest.json b/public/manifest.json index 89fda3f..eb8a391 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -9,18 +9,75 @@ "orientation": "portrait-primary", "scope": "/", "lang": "ru", + "categories": ["productivity", "utilities"], + "screenshots": [ + { + "src": "/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "form_factor": "narrow" + } + ], "icons": [ + { + "src": "/icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png", + "purpose": "any" + }, { "src": "/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, + { + "src": "/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "any" + }, { "src": "/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" + }, + { + "src": "/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" } ] } diff --git a/public/mobile-pwa-test.html b/public/mobile-pwa-test.html new file mode 100644 index 0000000..a5b772b --- /dev/null +++ b/public/mobile-pwa-test.html @@ -0,0 +1,415 @@ + + +
+ + +