PWA在iOS上为啥不支持添加到主屏幕?
我用React做了一个PWA应用,Android上能正常添加到主屏幕,但在iOS Safari里点“添加到主屏幕”后,图标和启动画面都不对,而且离线也用不了。是不是iOS根本不支持PWA啊?
我试过加了apple-touch-icon和manifest.json,还设置了display: standalone,但还是不行。下面是我写的CSS里关于启动画面的部分:
@media screen and (prefers-color-scheme: light) {
body {
background-color: #ffffff;
}
}
/* iOS 启动画面背景 */
body::before {
content: "";
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #f5f5f5;
z-index: 9999;
}
先说结论:iOS是自动生成启动画面的。它会拿你的
apple-touch-icon,居中显示在屏幕上,然后自动填充背景色。你想要的效果,全靠HTML里的meta标签和正确的图标链接,跟CSS没关系。你离线用不了,大概率是Service Worker没注册好,或者iOS为了省电把后台进程杀了,但咱们先解决图标和启动画面的问题。下面是我在React项目里实践过的配置,直接照着改。
首先,在你的
index.html的<head>里加上这些必须的标签。这几个是iOS识别PWA的关键:关于启动画面,你不用写CSS,iOS会自动处理。但是,你的图标最好是正方形的PNG,不要带圆角和透明光晕,iOS会自动给你加圆角和高光背景。如果你的图标设计本身就有复杂的背景,在iOS自动生成的启动画面上可能会显得很丑,这时候你得重新设计一个干净的图标。
至于离线功能,如果你是用
create-react-app或者vite脚手架,确保Service Worker是在index.js或者main.js里注册的,而且路径要正确。如果是iOS 16.4+,它对
manifest.json的支持好了一些,但为了兼容老版本,上面的meta标签和apple-touch-icon绝对不能少。别再纠结那个CSS伪元素了,那是给Android或者普通浏览器加载时看的,iOS在从桌面图标点开到页面渲染完成之间的那个过渡页,是不受你CSS控制的。把上面那段HTML加进去,换个干净的图标,基本就能解决你图标和启动画面不对的问题。