iOS 11.4 上独立模式下的 PWA 问题
Issues with PWA in standalone mode on iOS 11.4
我的网络应用程序在我能找到的所有浏览器中都运行良好。如果我在桌面上的 Firefox 和 Chrome 中安装该应用程序,它在线和离线都可以正常工作。与桌面 Safari 相同。
我的问题是移动设备上的 Safari。如果我使用浏览器,一切似乎都可以在线或离线工作,没问题。但是,当我将应用程序添加到我的主屏幕时,至少以独立模式打开该应用程序一次(以启动缓存),然后关闭我的网络连接。问题是,当我尝试再次开始使用该应用程序时,我的应用程序内部出现了可怕的 "No connection" 屏幕。
我这辈子都弄不明白为什么这行不通,我准备把我的电脑扔掉 window。
我目前正在 workbox-webpack-plugin
中使用 InjectManifest
方法,以便将工作箱和我的预缓存清单放入我的服务工作者中。
我的清单:
{
"short_name": "React Notes",
"name": "React PWA notes",
"icons": [
{
"src": "staticAssets/favicon.png",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/png"
},
{
"src": "staticAssets/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "staticAssets/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "./index.html",
"scope":"/",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
我的服务人员:
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// Cache hit - return response
if (response) {
return response;
}
return fetch(event.request);
}
)
);
});
我的头index.html
...
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover">
<meta name="theme-color" content="#000000">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="manifest" href="/manifest.json">
...
<!-- here be apple specific icon stuff -->
我的 workbox webpack 插件配置
new workboxPlugin.InjectManifest({
swSrc: './src/sw.js',
swDest: 'service-worker.js',
importWorkboxFrom: 'local'
})
我有一半希望它与我的 index.html 或清单有关,但我所做的任何更改都不起作用。
有人知道吗?
我不知道这是否回答了你的问题,但我最近遇到了类似的问题,也许是一样的:
在浏览器、桌面和移动设备上一切正常,但是当安装到移动设备的主屏幕时,应用程序没有启动,如您所述。
我将 workbox 用于离线功能,并且有一个起始 url 未被缓存路由的正则表达式捕获。添加此路由后,手机上安装的应用程序的离线模式工作...我仍然不知道为什么它在浏览器中工作。
您的问题可能是由于 workbox 使用 importScripts 而目前 iOS 没有正确缓存导入的脚本。这是即将进行的修复。
尝试直接引用所有工作箱文件,然后注释掉主工作箱中的导入脚本行 JavaScript。
我的网络应用程序在我能找到的所有浏览器中都运行良好。如果我在桌面上的 Firefox 和 Chrome 中安装该应用程序,它在线和离线都可以正常工作。与桌面 Safari 相同。
我的问题是移动设备上的 Safari。如果我使用浏览器,一切似乎都可以在线或离线工作,没问题。但是,当我将应用程序添加到我的主屏幕时,至少以独立模式打开该应用程序一次(以启动缓存),然后关闭我的网络连接。问题是,当我尝试再次开始使用该应用程序时,我的应用程序内部出现了可怕的 "No connection" 屏幕。
我这辈子都弄不明白为什么这行不通,我准备把我的电脑扔掉 window。
我目前正在 workbox-webpack-plugin
中使用 InjectManifest
方法,以便将工作箱和我的预缓存清单放入我的服务工作者中。
我的清单:
{
"short_name": "React Notes",
"name": "React PWA notes",
"icons": [
{
"src": "staticAssets/favicon.png",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/png"
},
{
"src": "staticAssets/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "staticAssets/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "./index.html",
"scope":"/",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
我的服务人员:
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// Cache hit - return response
if (response) {
return response;
}
return fetch(event.request);
}
)
);
});
我的头index.html
...
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover">
<meta name="theme-color" content="#000000">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="manifest" href="/manifest.json">
...
<!-- here be apple specific icon stuff -->
我的 workbox webpack 插件配置
new workboxPlugin.InjectManifest({
swSrc: './src/sw.js',
swDest: 'service-worker.js',
importWorkboxFrom: 'local'
})
我有一半希望它与我的 index.html 或清单有关,但我所做的任何更改都不起作用。
有人知道吗?
我不知道这是否回答了你的问题,但我最近遇到了类似的问题,也许是一样的:
在浏览器、桌面和移动设备上一切正常,但是当安装到移动设备的主屏幕时,应用程序没有启动,如您所述。
我将 workbox 用于离线功能,并且有一个起始 url 未被缓存路由的正则表达式捕获。添加此路由后,手机上安装的应用程序的离线模式工作...我仍然不知道为什么它在浏览器中工作。
您的问题可能是由于 workbox 使用 importScripts 而目前 iOS 没有正确缓存导入的脚本。这是即将进行的修复。
尝试直接引用所有工作箱文件,然后注释掉主工作箱中的导入脚本行 JavaScript。