有没有办法在iOS上自动更新(或只是清除缓存)PWA?

Ste*_*hen 6 ios vue.js progressive-web-apps quasar-framework

我一直在iOS上苦苦挣扎,想在Android上轻松工作:让我的PWA在有新版本时自动更新。我完全不确定在iOS上是否有可能。我已经使用vue.js和Quasar来构建我的应用程序,并且一切在Android上都是开箱即用的。这是当前iOS版本上的情况(难看,糟糕):

  1. 我可以检查自己的服务器的版本,并将其与存储在我的应用程序(在indexedDB中)中的当前服务器进行比较,并发出一个通知,指出有一个新版本。到目前为止,一切都很好。
  2. 除了让用户手动清除SAFARI CACHE(!!)之外,我无法弄清楚如何从应用程序内以编程方式清除PWA缓存或以其他方式强制上载。

所以在这一点上,我想我的问题是:

  1. 有新版本可用时,是否有人可以在iOS(11.3或更高版本)上获取PWA来自动更新?
  2. 有没有办法从我的PWA中清除(Safari)应用程序缓存?

显然,要通知用户要进行更新,他们必须在应用程序外部执行几个步骤才能对其进行刷新,这是一种令人难以置信的糟糕用户体验,但是除非没有我遗漏的东西,否则这似乎是iOS当前所处的位置。有人在任何地方进行过这项工作吗?

Ste*_*hen 13

经过数周的搜索,我终于找到了解决方案:

  1. 我在服务器上添加了对versionstring的检查,并如上所述将其返回到应用程序。

  2. 我在localtstorage(IndexedDB)中寻找它,如果找不到,则添加它。如果找到它,则比较版本,如果服务器上有较新的版本,则会抛出一个对话框。

  3. 退出该对话框(我的按钮标记为“更新”)window.location.reload(true),然后将新的版本字符串存储在localstorage中

瞧!我的应用程序已更新!我不敢相信它可以归结为如此简单,在任何地方都找不到解决方案。希望这对别人有帮助!

2019年9月更新:

上面的技术存在一些问题,尤其是它绕过了PWA服务工作器机制,有时重新加载不会立即加载新内容(因为当前的SW不会释放页面)。我现在有一个新的解决方案,似乎可以在所有平台上使用:

forceSWupdate () {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.getRegistrations().then(function (registrations) {
      for (let registration of registrations) {
        registration.update()
      }
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,在服务人员内部,如果有更新,我会弹出对话框,然后location.reload(true)从那里进行操作。这总是导致我的应用程序立即刷新(具有我添加的重要警告skipWaitingclientsClaim注册指令)。

这适用于每个平台,并且我可以以编程方式检查更新或等待服务人员自己执行更新(尽管它的检查时间因平台,设备和其他未知因素而有很大差异。通常不超过24个小时)。

  • 虽然不是真正的无声自动更新。如果您一天要多次部署前端,我可能会看到用户非常讨厌单击更新按钮。有什么想法吗? (2认同)

小智 6

如果有人仍然遇到此问题,registration.update() 对我不起作用。我使用了确切的解决方案,但是当我的服务器的版本与我本地存储的版本不匹配时,我必须取消注册服务工作人员才能使其正常工作。

  if ('serviceWorker' in navigator) {
   await this.setState({ loadingMessage: 'Updating Your Experience' })
   navigator.serviceWorker.getRegistrations().then(function(registrations) {
    registrations.map(r => {
      r.unregister()
    })
   })
   await AsyncStorage.setItem('appVersion', this.state.serverAppVersion)
   window.location.reload(true)
  } 
Run Code Online (Sandbox Code Playgroud)

然后,当应用程序重新加载时,服务工作人员将重新注册,并且应用程序的当前版本在 iOS safari 浏览器和“添加书签”的 PWA 上可见。