PWA 添加到主屏后图标不显示怎么办?
我做了一个 PWA 应用,manifest.json 里配了 icons,也通过 Lighthouse 检测通过了,但在安卓 Chrome 上“添加到主屏”后,桌面上的图标却是默认的灰色齿轮,根本没用我设置的 PNG 图标。这是啥原因?
我试过把图标路径改成绝对路径、检查 MIME 类型,甚至换了几种尺寸,都不行。下面是我 manifest 中引用的 CSS 里对启动画面的样式(虽然可能不相关,但贴出来以防万一):
.splash-screen {
background: #fff url('/icons/icon-192x192.png') no-repeat center;
background-size: 120px;
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: 9999;
}
Lighthouse 通过不代表图标真的能加载出来,它只验证 manifest格式和文件存在性,不验证实际运行时的加载情况。
最常见的原因是 浏览器缓存。Chrome 在首次读取 manifest 后会把图标信息缓存下来,你后来改了图标但缓存没更新,它就继续用默认的灰色齿轮。清除浏览器缓存或者用隐身模式测试一下,如果隐身模式下图标正常显示了,那就是缓存的锅。
如果还不行,打开 Chrome DevTools 的 Application 面板,点开 Manifest,看看这里显示的图标能不能正常预览。如果预览是红叉,那就是路径问题或者文件实际不存在。
另外提醒一下,你的 manifest 里的 icons 配置最好同时包含 192x192 和 512x192 这两个尺寸,少一个都可能出问题。路径用相对路径就行,不用刻意改成绝对路径。
还有,如果你用了 service worker,记得检查 sw 的缓存策略,别把 manifest 或者图标文件给缓存住了。
你先去隐身模式跑一下,大概率是缓存问题。
通用的做法是:
1. 确保 manifest.json 里每个 icon 的
sizes字段里至少包含 192x192 和 512x512,而且这两个尺寸的图标必须是真实存在的 PNG 文件,别用 SVG(安卓老版本不认)。2. 图标文件本身要小,建议 192 和 512 的 PNG 都控制在 50KB 以内,太大了安卓可能直接忽略。
3. 图标文件的 MIME 类型必须是 image/png,服务端要正确返回 Content-Type,别用 nginx 默认的 text/plain。
4. 最关键的一点:manifest.json 的 URL 要和页面同源,不能跨域;路径建议用绝对路径,比如
/manifest.json,别用相对路径。5. 检查下 HTML 里
这行有没有漏写,或者写在了 iframe 里(无效)。6. 如果你用了 HTTPS,manifest 必须也通过 HTTPS 加载;HTTP 页面也能加 PWA,但图标可能被拦截,建议全站 HTTPS。
7. 清除 Chrome 缓存后重新添加,有时候旧的 manifest 被缓存了,即使改了也不更新。
我之前遇到过一个坑:图标 PNG 里带透明通道,安卓解析时直接跳过,后来转成纯色背景的 PNG 就好了。还有人因为用了 WebP 格式(虽然 manifest 支持),但安卓 Chrome 某些版本不认,最后全换成 PNG 就正常了。
顺便提一句,你贴的那段 CSS 是启动页背景图,和主屏图标无关,不用管它。
如果上述都确认没问题,可以在 Chrome 地址栏输入
chrome://version/看下安卓 Chrome 的版本号,太老的版本(比如 80 以下)对 PWA 支持不全,升级到最新版试试。