尚未在iOS上自动更新(或只是清除缓存)PWA的任何方式?

时间:2018-09-07 11:38:47

标签: 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当前的立足点遗漏了什么。有没有人在做这项工作?

2 个答案:

答案 0 :(得分:7)

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

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

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

  3. 关闭此对话框(我的按钮标记为“更新”)运行window.location.reload(true),然后将新的版本字符串存储在本地存储中

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

答案 1 :(得分:1)

如果仍然有人对此有疑问,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)
  } 

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