我一直在 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)
然后将新的版本字符串存储在本地存储中
瞧!我的应用程序已更新!我不敢相信事情竟然如此简单,我在任何地方都找不到解决方案。希望这对其他人有帮助!
2019 年 9 月更新:
上述技术存在一些问题,特别是它绕过了 PWA 服务工作机制,并且有时重新加载不会立即加载新内容(因为当前的软件不会释放页面)。我现在有一个新的解决方案,似乎适用于所有平台:
function forceSWupdate() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations().then(function (registrations) {
for (let registration of registrations) {
registration.update()
}
})
}
}
forceSWupdate()
在我的服务人员内部,如果有更新,我现在会抛出对话框,然后执行我的操作location.reload(true)
从那里。这总是会导致我的应用程序立即刷新(我添加了重要的警告skipWaiting
and clientsClaim
我的注册指令)。
这在每个平台上都是一样的,我可以以编程方式检查更新或等待服务工作人员自行完成(尽管它检查的时间因平台、设备和其他不可知因素而异。通常不超过 24不过几个小时。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)