if (navigator.standalone) {
  await fetch('/sw.js', {cache: 'no-store'});
  await reg.update();
}

同一套代码安卓离线能打开,iPhone 加到主屏后断网只显示 Safari 的错误页,Cache Storage 里能查到条目,导航请求却没有命中。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,iOS 上 PWA 的存储和 Safari 共用,长时间不打开会被系统回收,缓存条目还在但内容已经失效。旧版本对 Service Worker 的更新检查也更保守,脚本改动要重启应用才生效。

「iOS PWA 缓存」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

处理上按这个顺序:关键页面用 IndexedDB 再存一份数据,缓存被清还能渲染骨架;启动时检查缓存是否完整,缺文件就静默补一次预缓存;iOS 上每次冷启动都做一次更新检查,别等系统自己触发。

改完只确认一件事:iPhone 主屏应用放置一周后断网打开,核心页面仍能渲染,图片缺失时有占位。

作者 9823189