From d6dc1d76a08d244738813b93d7745808af1ca987 Mon Sep 17 00:00:00 2001 From: Fovway Date: Mon, 20 Oct 2025 09:42:36 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20PWA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Изменена структура инструкций по тестированию PWA, добавлена диагностическая страница для отладки. - Обновлен manifest.json с добавлением поля "id". - Реализована задержка при отображении кнопки установки для улучшения пользовательского опыта. - Добавлены функции для проверки возможности установки PWA и отображения инструкций для мобильных устройств. --- PWA-TESTING.md | 33 +++- public/manifest.json | 1 + public/pwa-debug.html | 411 ++++++++++++++++++++++++++++++++++++++++++ public/pwa.js | 97 +++++++++- 4 files changed, 535 insertions(+), 7 deletions(-) create mode 100644 public/pwa-debug.html diff --git a/PWA-TESTING.md b/PWA-TESTING.md index a73a35c..2d9bafa 100644 --- a/PWA-TESTING.md +++ b/PWA-TESTING.md @@ -22,17 +22,22 @@ ## Как протестировать -### 1. Откройте тестовую страницу для мобильных устройств +### 1. Откройте диагностическую страницу PWA +``` +http://localhost:3000/pwa-debug.html +``` + +### 2. Откройте тестовую страницу для мобильных устройств ``` http://localhost:3000/mobile-pwa-test.html ``` -### 2. Откройте обычную тестовую страницу +### 3. Откройте обычную тестовую страницу ``` http://localhost:3000/test-pwa.html ``` -### 3. Проверьте требования PWA +### 4. Проверьте требования PWA На мобильной тестовой странице автоматически проверяются все требования: - ✅ HTTPS или localhost - ✅ Service Worker @@ -40,12 +45,12 @@ http://localhost:3000/test-pwa.html - ✅ Иконки - ❌ Уже установлено (должно быть красным, если не установлено) -### 4. Установка приложения +### 5. Установка приложения - Если все проверки пройдены, появится кнопка "Установить приложение" - Нажмите на неё для установки PWA - Следуйте инструкциям браузера или используйте инструкции на странице -### 5. Проверка в разных браузерах +### 6. Проверка в разных браузерах #### Chrome/Edge: - Откройте DevTools (F12) @@ -96,6 +101,9 @@ http://localhost:3000/test-pwa.html - Улучшенная проверка установки PWA - Поддержка различных режимов отображения - **Кнопка установки показывается только на мобильных устройствах** +- Принудительная проверка возможности установки +- Специальные инструкции для Android и iOS +- Диагностическая страница для отладки PWA ## Возможные проблемы и решения @@ -151,8 +159,22 @@ window.debugPWA(); // Проверить Service Worker navigator.serviceWorker.getRegistrations().then(console.log); + +// Проверить возможность установки +window.checkInstallability(); + +// Принудительная попытка установки +window.forceInstall(); ``` +### Диагностическая страница +Используйте `http://localhost:3000/pwa-debug.html` для: +- Детальной диагностики всех требований PWA +- Проверки загрузки манифеста и Service Worker +- Отображения информации о браузере и устройстве +- Просмотра ошибок консоли +- Тестирования установки PWA + ### Lighthouse Запустите аудит Lighthouse в Chrome DevTools: 1. Откройте DevTools (F12) @@ -166,6 +188,7 @@ 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/pwa-debug.html` - диагностическая страница PWA - ✅ `http://localhost:3000/mobile-pwa-test.html` - мобильная тестовая страница - ✅ `http://localhost:3000/test-pwa.html` - обычная тестовая страница diff --git a/public/manifest.json b/public/manifest.json index eb8a391..9b23dac 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -9,6 +9,7 @@ "orientation": "portrait-primary", "scope": "/", "lang": "ru", + "id": "/", "categories": ["productivity", "utilities"], "screenshots": [ { diff --git a/public/pwa-debug.html b/public/pwa-debug.html new file mode 100644 index 0000000..072d160 --- /dev/null +++ b/public/pwa-debug.html @@ -0,0 +1,411 @@ + + + + + + Диагностика PWA - NoteJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

🔍 Диагностика PWA

+ +
+

Основные требования PWA

+
+
+ HTTPS или localhost + Проверка... +
+
+ Service Worker + Проверка... +
+
+ Manifest + Проверка... +
+
+ Иконки + Проверка... +
+
+
+ +
+

Детальная диагностика

+
+
+ Manifest загружается + Проверка... +
+
+ Service Worker регистрируется + Проверка... +
+
+ Иконки доступны + Проверка... +
+
+ beforeinstallprompt событие + Проверка... +
+
+
+ +
+

Установка приложения

+ +
+
+ +
+

Информация о манифесте

+
Загрузка...
+
+ +
+

Информация о Service Worker

+
Загрузка...
+
+ +
+

Информация о браузере

+
Загрузка...
+
+ +
+

Ошибки консоли

+
Нет ошибок
+
+
+ + + + diff --git a/public/pwa.js b/public/pwa.js index 989efa9..a19a5d3 100644 --- a/public/pwa.js +++ b/public/pwa.js @@ -66,7 +66,11 @@ class PWAManager { console.log('beforeinstallprompt событие получено'); e.preventDefault(); this.deferredPrompt = e; - this.showInstallButton(); + + // Показываем кнопку установки с задержкой для лучшего UX + setTimeout(() => { + this.showInstallButton(); + }, 1000); }); } @@ -101,7 +105,8 @@ class PWAManager { const ua = navigator.userAgent; return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua) || (navigator.maxTouchPoints && navigator.maxTouchPoints > 2) || - window.matchMedia('(max-width: 768px)').matches; + window.matchMedia('(max-width: 768px)').matches || + /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua); } // Проверка на мобильный Safari @@ -178,6 +183,10 @@ class PWAManager { console.log('Результат установки:', choiceResult.outcome); if (choiceResult.outcome === 'accepted') { console.log('Пользователь установил приложение'); + this.showNotification('Приложение успешно установлено!', 'success'); + } else { + console.log('Пользователь отклонил установку'); + this.showNotification('Установка отменена', 'warning'); } this.deferredPrompt = null; this.removeInstallButton(); @@ -188,6 +197,41 @@ class PWAManager { } } + // Принудительная проверка возможности установки + async checkInstallability() { + if (!this.isMobileDevice()) { + return false; + } + + // Проверяем все требования PWA + const requirements = { + hasManifest: document.querySelector('link[rel="manifest"]') !== null, + hasServiceWorker: 'serviceWorker' in navigator, + isSecure: location.protocol === 'https:' || location.hostname === 'localhost', + hasIcons: document.querySelector('link[rel="icon"]') !== null + }; + + const allRequirementsMet = Object.values(requirements).every(req => req); + + if (!allRequirementsMet) { + console.log('Не все требования PWA выполнены:', requirements); + return false; + } + + // Проверяем, есть ли deferredPrompt + if (this.deferredPrompt) { + return true; + } + + // Для мобильных устройств без deferredPrompt показываем инструкции + if (this.isMobileDevice()) { + this.showMobileInstallInstructions(); + return true; + } + + return false; + } + // Показать инструкции для Safari showSafariInstructions() { const instructions = ` @@ -210,6 +254,41 @@ class PWAManager { alert(instructions); } + // Показать инструкции для мобильных устройств + showMobileInstallInstructions() { + const isAndroid = /Android/i.test(navigator.userAgent); + const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent); + + let instructions = ''; + + if (isAndroid) { + instructions = ` + Для установки приложения на Android: + 1. Нажмите на меню браузера (⋮) + 2. Выберите "Установить приложение" или "Добавить на главный экран" + 3. Подтвердите установку + + Или нажмите на иконку установки в адресной строке, если она появилась. + `; + } else if (isIOS) { + instructions = ` + Для установки приложения на iOS: + 1. Нажмите кнопку "Поделиться" (□↗) внизу экрана + 2. Выберите "На экран Домой" + 3. Нажмите "Добавить" + `; + } else { + instructions = ` + Для установки приложения: + 1. Откройте меню браузера + 2. Найдите "Установить приложение" или "Добавить на главный экран" + 3. Следуйте инструкциям браузера + `; + } + + alert(instructions); + } + // Удаление кнопки установки removeInstallButton() { const installButton = document.getElementById('pwa-install-button'); @@ -462,4 +541,18 @@ window.forceUpdate = async () => { setTimeout(() => { window.location.reload(); }, 1000); +}; + +// Проверка возможности установки PWA +window.checkInstallability = () => { + return pwaManager.checkInstallability(); +}; + +// Принудительная попытка установки +window.forceInstall = () => { + if (pwaManager.isMobileDevice()) { + pwaManager.showMobileInstallInstructions(); + } else { + pwaManager.showManualInstallInstructions(); + } }; \ No newline at end of file