1.**#1019: cache-first SW без offline queue достаточен для low-load PWA v1.** Приложение открывается мгновенно (кешированные статические файлы). Если сети нет — пользователь видит ошибку и повторяет попытку когда сеть вернётся.
2.**Частота использования: ~1 раз/неделю.** Вероятность "нажал SOS без сети и забыл повторить" — крайне низкая. Экстренная ситуация мотивирует повторную попытку.
3.**navigator.onLine проверка + UX:**
```javascript
button.addEventListener('click', async () => {
if (!navigator.onLine) {
showError('Нет подключения. Проверьте сеть и попробуйте снова.');
return;
}
try {
await sendSignal();
showSuccess();
} catch (e) {
showError('Ошибка отправки. Попробуйте снова.');
}
});
```
Даже если `navigator.onLine` ненадёжен — try/catch ловит ошибку fetch.
- Приложение откроется в Safari tab вместо fullscreen
- Функциональность сохраняется полностью
- UX деградирует: видна адресная строка
2.**Telegram Web App (альтернатива):**
- Baton как Telegram Mini App
-Не зависит от PWA standalone
- Ограничение: работает только внутри Telegram
3.**Нативная обёртка (крайний случай):**
- Capacitor/Cordova → IPA → TestFlight
- Для 300-400 пользователей — Enterprise distribution или Ad Hoc provisioning
- Overkill, только если Apple полностью заблокирует PWA
**Рекомендация:** не предпринимать действий сейчас. Мониторить iOS release notes.
---
## Часть 3: iOS 7-дневная очистка кеша
### Проблема
WebKit (Safari) очищает все website data (включая Service Worker registration, Cache API, localStorage, IndexedDB) после **7 дней непрерывного неиспользования** домена.
### Влияние на Baton
| Что теряется | Последствие | Серьёзность |
|---|---|---|
| SW registration | При следующем открытии — SW re-registers (нужна сеть) | Низкая |
| Cache API (precached assets) | Первое открытие после 7 дней — загрузка из сети | Низкая |
| localStorage (UUID) | Пользователь получает новый UUID → повторная регистрация | Средняя |
### Митигация
1.**Подсказка при установке:** "Открывайте приложение хотя бы раз в неделю для надёжной работы"
2.**UUID на сервере:** при потере localStorage UUID — пользователь регистрируется заново. Это неидеально, но приемлемо (знаем имя, не знаем что это тот же человек).
3.**v2 mitigation:** привязка Telegram user ID (через /start в боте) как persistent identifier, не зависящий от browser storage.
---
## Часть 4: iOS Safari Private Mode (#1015)
### Проблема
`localStorage.setItem()` бросает `SecurityError` в приватном режиме iOS Safari.