Как отключить проверку подключения в приложении, работающем в автономном режиме (Chrome - Android и Safari iOS)
Я создаю веб-приложение, которое работает в автономном режиме. Я использую автономную библиотеку redux для хранения моего состояния в IndexedDB. Приложение прекрасно работает на рабочем столе - я могу отключиться от Интернета, обновить приложение, и все данные будут повторно скопированы из IndexedDB. Однако, когда я пытаюсь сделать то же самое на Android (или iPhone). В тот момент, когда я перехожу в режим полета и пытаюсь обновить приложение, я получаю "Вы находитесь в автономном режиме". Ошибка диназавра (в Chrome).
Вот что у меня в файле манифеста сейчас, что имеет отношение:
{
"short_name": "...",
"name": "...",
"manifest_version": 2,
"offline_enabled": true,
"start_url": "/events",
"theme_color": "#000000",
"background_color": "...",
"display": "standalone",
"default_locale": "en",
"description": "...",
"permissions": [
"unlimitedStorage"
],
"icons": [{...}]
}
Вот мой sw.js:
var CACHE_NAME = 'my-cache-v1';
var urlsToCache = [
'/',
'/index.html',
'/dist/bundle.css',
'/dist/bundle.js',
'/assets/font-awesome/fonts/fontawesome-webfont.woff2',
'/assets/fonts/...',
'/assets/images/...',
'/assets/images/favicon.ico',
'/assets/tinymce/tinymce.min.js',
'/assets/activity_notification.mp3',
];
self.addEventListener('install', function(event) {
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('ServiceWorker: Opened cache');
return cache.addAll(urlsToCache);
})
);
});
Вот мой импорт этого в index.html:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(function(registration) { console.log('ServiceWorker registration successful with scope: ', registration.scope); })
.catch(function(err) { console.log('ServiceWorker registration failed: ', err); });
}
Все мои статические ресурсы, включая мои JavaScript-пакеты, кэшируются с помощью сервисного работника. Это работает, потому что я вижу консольные выходы из комплекта.
Я вижу, что все данные есть в IndexedDB. Это не отображается в консоли разработчика, когда я вижу офлайн Дино, хотя. Кажется, что Android просто мешает мне что-либо делать, если я не в сети.
GET ...url... net::ERR_INTERNET_DISCONNECTED ...url...
Navigated to data:text/html,chromewebdata
Есть ли способ отключить эту проверку? Как правильно это сделать?
1 ответ
Манифест вашего веб-приложения start_url
установлен в /events
так что это URL, по которому вы будете перемещаться при каждом запуске веб-приложения с домашнего экрана на устройстве Android.
Вы не включили свой fetch
обработчик событий, но я предполагаю, что он не отвечает на запросы навигации для /events
с кэшированным содержимым /
и у вас нет /events
явно добавлен в ваш кеш.
У вас есть несколько вариантов, в зависимости от того, /
а также /events
представлять отдельные страницы HTML:
- использование
/
вместо/events
какstart_url
, - добавлять
/events
в ваш список URL для предварительного кэширования, при условии, что это отдельная страница из/
, - Если на самом деле это одна и та же страница (потому что вы пишете одностраничное приложение, которое отвечает на все переходы одним и тем же HTML), то сохранение нескольких копий этой страницы под разными URL-адресами не очень эффективно. Вы должны вместо этого написать
fetch
обработчик событий, который проверяет,event.request.mode === 'navigate'
и, если так, всегда отвечайте кэшированным ответом для/
, - Или используйте такой инструмент, как
sw-precache
создать свой сервисный работник для вас как часть процесса сборки. Он может быть настроен для поддержки вашего списка ресурсов на основе результатов вашей сборки и может автоматически обрабатывать все переходы для одностраничных приложений, отвечая кэшированным ответом для вашего общего HTML-кода.