【发布时间】:2017-09-13 13:40:46
【问题描述】:
我正在构建一个离线优先的网络应用程序。我正在使用 redux-offline lib 将我的状态存储在 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
有没有办法禁用该检查?正确的做法是什么?
【问题讨论】:
-
“我所有的静态资源(包括我的 JavaScript 包)都使用服务工作者进行缓存。” 这包括您的 HTML 文件吗?您的服务人员是否处理导航请求?如果您在 Android 上看到离线恐龙,那么这意味着您没有使用以前缓存的 HTML 响应导航请求的软件。你能分享一下你的 Service Worker 设置吗?
-
@JeffPosnick 你是对的,我忘记了 SW 中的 index.html,我会尝试并回复你,谢谢!
-
@JeffPosnick 将 index.html(我项目中唯一的静态 html 文件)添加到 SW 并没有解决问题。用软件配置更新了问题。
标签: javascript indexeddb service-worker progressive-web-apps offlineapps