你刚上线了新的 favicon,在 Mac 上清完 Safari 缓存,标签页里终于出现了新图标。结果打开 iPhone 打开同一个网站——旧的那个灰色占位图还稳稳待在那里。要解决,你必须分别在 Safari iPhone 和 Mac 上清除 favicon 缓存,因为这两台设备各自维护着自己的图标数据库,根本不会通过 iCloud 同步。

为什么 Safari 在 iPhone 和 Mac 上的 favicon 缓存机制不一样

Safari 把 favicon 数据存在两层:一层是临时的浏览器缓存,另一层是持久化的 WebpageIcons 数据库,后者负责标签页、书签和"添加到主屏幕"流程的图标。在 macOS 上,这个数据库位于 ~/Library/Safari/WebpageIcons.db;在 iOS 上,它藏在 Safari 的沙盒里,你没法直接进去翻文件。

这两层缓存之间互不通信。在 Mac 上更新 favicon,对 iPhone 毫无影响——反过来也一样。所以同一个网站,在不同设备上同时显示两个不同的图标,一点都不奇怪。

前置条件

Mac 上如何清除 favicon 缓存

第一步:确认新 favicon 已经实际生效

打开 Safari,加载你的网站,然后查看源代码(Cmd + Option + U)。确认 <link rel='icon'> 标签指向的是新文件。如果旧路径还被硬编码在 HTML 里,清缓存也救不了你——正确的标签写法可以参考 我们的 HTML favicon 配置指南。

第二步:清空 Safari 的临时缓存

进入 Safari → 设置 → 高级,勾选 在菜单栏中显示"开发"菜单。然后点击 开发 → 清空缓存。这一步会清掉 Safari 用于渲染标签页的临时缓存,但不会动 WebpageIcons 数据库。

第三步:直接删除 WebpageIcons 数据库

完全退出 Safari(Cmd + Q)。打开终端,执行:

rm -f ~/Library/Safari/WebpageIcons.db
rm -f ~/Library/Safari/WebpageIcons.db-shm
rm -f ~/Library/Safari/WebpageIcons.db-wal

这几个文件保存着 Safari 在所有标签页和书签里展示过的每一个图标。删掉之后,Safari 在下次启动时会从零重建图标数据库。

第四步:重启 Safari 并重新加载

重新打开 Safari,加载你的网站。新 favicon 应该在几秒内就出现在标签页和书签栏里。如果没出现,说明你的 HTML 还在指向旧路径。

iPhone 上如何清除 favicon 缓存

iOS 上的处理方式不一样。你没法直接访问 Safari 的文件系统,所以只能靠从「设置」里清除站点数据,逼 Safari 重新拉取。

第一步:清除 Safari 的网站数据

打开 设置 app,滚到 Safari,点击 高级 → 网站数据。点击 删除全部网站数据。这一下会清掉所有站点的 cookie、缓存以及 Safari 的触控图标存储。

注意:这会让你在所有网站上退出登录。如果你只想测试 favicon 改动、不想丢失登录状态,用无痕浏览模式。

第二步:强制退出 Safari

从屏幕底部上滑(老款 iPhone 双击 Home 键)呼出应用切换器。把 Safari 卡片上滑强制退出,然后重新打开并加载你的网站。

第三步:用硬刷新绕过缓存

长按 Safari 地址栏里的刷新按钮,在弹出菜单里点 请求桌面版网站。打开一次再关掉,这样会强制重新请求一次,包括 favicon 文件。另一个替代方案是加个查询字符串打破缓存:

https://yoursite.com/?v=2

第四步:刷新主屏幕图标缓存

如果你之前把网站加到了 iPhone 主屏幕,那个图标来自 apple-touch-icon 文件——而不是普通的 favicon。要重置,先把主屏幕上的快捷方式删掉,再重新添加。Safari 会重新读取 HTML 里的 <link rel='apple-touch-icon'> 标签,下载一份新副本。

常见坑

如何避免以后再遇到 favicon 缓存问题

新图标在两台设备上都显示正常之后,用内容哈希命名的方式,从根源上防止再出岔子:

&lt;link rel='icon' href='/favicon.a1b2c3d4.svg' type='image/svg+xml'&gt;

每次部署都拿到一个全新的 URL,浏览器永远没法再返回旧的缓存副本。更深入的缓存破坏(cache-busting)方案,可以看我们的 favicon 缓存破坏指南。

想完整了解 rel='icon' 属性以及浏览器接受的所有 MIME 类型,请查阅 WHATWG HTML Living Standard。