iOS 11.3升级后Progressive Web App停止自动更新问题求助
iOS 11.3 PWA缓存index.php无法更新的解决方案
我之前帮同事排查过几乎一模一样的问题——iOS 11.3对PWA的缓存机制做了不少调整,导致之前的缓存策略直接失效。给你几个针对性的解决思路,按优先级尝试:
1. 检查Service Worker的缓存策略(最可能的根因)
如果你的PWA用到了Service Worker,它的缓存优先级会直接覆盖HTTP头的缓存设置。iOS 11.2对Service Worker的规则执行比较宽松,但11.3版本严格了很多,之前的缓存优先策略可能会强制保留旧的index.php。
你需要给index.php单独设置网络优先的规则,修改Service Worker的fetch事件代码:
self.addEventListener('fetch', (event) => { // 对index.php强制先走网络请求,失败再 fallback 到缓存 if (event.request.url.includes('index.php')) { event.respondWith( fetch(event.request) .catch(() => caches.match(event.request)) ); } else { // 其他资源保持原有缓存策略即可 event.respondWith( caches.match(event.request) .then((response) => response || fetch(event.request)) ); } });
修改后重新部署Service Worker,用户的PWA会自动更新新的Worker规则。
2. 强化HTTP缓存头的设置
iOS 11.3对no-cache的解析逻辑和旧版本有差异,建议在.htaccess里添加更严格的缓存控制头,彻底禁用缓存:
<Files "index.php"> # 禁止任何形式的缓存存储(比no-cache更严格) Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0" # 兼容HTTP 1.0协议 Header set Pragma "no-cache" # 设置过期时间为过去,强制浏览器重新请求 Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT" </Files>
3. 强制清除现有缓存
iOS 11.3可能已经缓存了旧的index.php快照,即使你修改了策略,也需要先清除旧缓存:
- 让用户删除PWA,再从Safari重新添加到主屏幕;
- 或者在Safari的「设置→Safari→清除历史记录与网站数据」里清除对应域名的缓存,再重新打开PWA。
如果用户群体较大,你可以在PWA里加一个手动更新按钮,触发Service Worker主动更新:
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then((reg) => { // 监听Service Worker更新事件 reg.addEventListener('updatefound', () => { const newWorker = reg.installing; newWorker.addEventListener('statechange', () => { if (newWorker.state === 'installed') { // 提示用户更新应用 if (confirm('新版本已准备好,是否立即更新?')) { window.location.reload(); } } }); }); }); }
4. 版本号参数兜底
如果上面的方法都不生效,可以给index.php加版本号参数,比如index.php?v=20240520,每次更新代码时修改版本号。这样iOS会认为这是全新资源,必然会重新请求最新版本,完全绕过缓存。
内容的提问来源于stack exchange,提问作者Zobris




