You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动