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

有没有办法在iOS上自动更新(或清除缓存)PWA?,ios,vue.js,progressive-web-apps,quasar-framework,Ios,Vue.js,Progressive Web Apps,Quasar Framework,在iOS上,我一直在努力解决一些在Android上很容易实现的问题:当有新版本时,让我的PWA自动更新。我根本不确定这在iOS上是否可行。我已经使用vue.js和Quasar构建了我的应用程序,在Android上一切都是开箱即用的。以下是iOS版本当前的情况(丑陋、可怕): 我可以检查我自己的服务器的版本,并将其与我的应用程序(indexedDB)中存储的当前版本进行比较,然后抛出一个新版本的通知。到目前为止还不错 除了让用户手动清除SAFARI缓存(!!)之外,我无法想出如何从应用程序中以编程

在iOS上,我一直在努力解决一些在Android上很容易实现的问题:当有新版本时,让我的PWA自动更新。我根本不确定这在iOS上是否可行。我已经使用vue.js和Quasar构建了我的应用程序,在Android上一切都是开箱即用的。以下是iOS版本当前的情况(丑陋、可怕):

  • 我可以检查我自己的服务器的版本,并将其与我的应用程序(indexedDB)中存储的当前版本进行比较,然后抛出一个新版本的通知。到目前为止还不错
  • 除了让用户手动清除SAFARI缓存(!!)之外,我无法想出如何从应用程序中以编程方式清除PWA缓存或以其他方式强制上载
  • 所以在这一点上,我想我的问题是:

  • 是否有人能够在iOS(11.3或更高版本)上获得PWA,以便在新版本可用时自动更新
  • 有没有办法从我的PWA中清除(safari)应用程序缓存

  • 显然,通知用户为了更新,他们必须在应用程序之外执行几个步骤才能刷新应用程序,这是一种极其糟糕的用户体验,但似乎这就是iOS目前的状况,除非我遗漏了什么。有人在任何地方做过这项工作吗?

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

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

  • 我在localtstorage(IndexedDB)中查找它,如果找不到,就添加它。如果我找到了,我会比较版本,如果服务器上有更新的版本,我会弹出一个对话框

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

  • 瞧!我的应用程序已更新!我真不敢相信事情竟如此简单,我在任何地方都找不到解决办法。希望这对其他人有帮助

    2019年9月更新:

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

    forceSWupdate () {
      if ('serviceWorker' in navigator) {
        navigator.serviceWorker.getRegistrations().then(function (registrations) {
          for (let registration of registrations) {
            registration.update()
          }
        })
      }
    }
    
    在我的serviceworker中,如果有更新,我现在会弹出对话框,然后从那里执行我的
    location.reload(true)
    。这通常会导致我的应用程序立即刷新(重要的警告是,我在注册时添加了
    skipWaiting
    clientsClaim
    指令)


    这在每个平台上都是一样的,我可以通过编程检查更新,或者等待服务人员自己做(尽管检查时间因平台、设备和其他未知因素而有很大差异。通常不超过24小时)。

    如果有人对此仍有问题,请注册。更新()不适合我。我使用了完全相同的解决方案,但当服务器上的版本与本地存储的版本不匹配时,我必须注销服务人员才能使其工作

      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上可见。

    我认为当您打开应用程序时,它应该在后台更新。然后在关闭应用程序后,下次打开应用程序时,您应该会看到更改。那没有发生吗?是的,应该发生,但是没有。我从任何地方都没有看到任何证据表明这在iOS上有效。你有一个有效的例子吗?(顺便说一句,这是一个带有服务工作者的PWA,所以它也应该是缓存。)不,我没有当前的iOS设备。只是一个旧的iPod,抱歉。但不是真正的无声自动更新。如果您每天多次部署前端,我可以看到用户对单击更新按钮感到非常厌倦。想法?是的,但在苹果解决这个问题之前,这是一个必要的解决办法,比什么都不做要好得多。你的应用程序能否就用户是否“正在做某事”做出明智的决定?如果是这样,如果他们什么也不做,它可能会自动更新。如果他们正在做某事,它可以等待(比如说)长达24个小时,然后(如果他们仍然在某个事物的中间)提出一个请求他们更新的消息。我认为这将取决于应用程序。实际上,我不能抛出更新通知,而只是在特定保存发生后强制重新加载应用程序,但在这种情况下,我选择了透明(针对用户),因为它非常罕见。您是否将forceSWupdate()放在版本检查方法中?