Ste*_*hen 6 ios vue.js progressive-web-apps quasar-framework
我一直在iOS上苦苦挣扎,想在Android上轻松工作:让我的PWA在有新版本时自动更新。我完全不确定在iOS上是否有可能。我已经使用vue.js和Quasar来构建我的应用程序,并且一切在Android上都是开箱即用的。这是当前iOS版本上的情况(难看,糟糕):
所以在这一点上,我想我的问题是:
显然,要通知用户要进行更新,他们必须在应用程序外部执行几个步骤才能对其进行刷新,这是一种令人难以置信的糟糕用户体验,但是除非没有我遗漏的东西,否则这似乎是iOS当前所处的位置。有人在任何地方进行过这项工作吗?
Ste*_*hen 13
经过数周的搜索,我终于找到了解决方案:
我在服务器上添加了对versionstring的检查,并如上所述将其返回到应用程序。
我在localtstorage(IndexedDB)中寻找它,如果找不到,则添加它。如果找到它,则比较版本,如果服务器上有较新的版本,则会抛出一个对话框。
退出该对话框(我的按钮标记为“更新”)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)从那里进行操作。这总是导致我的应用程序立即刷新(具有我添加的重要警告skipWaiting和clientsClaim注册指令)。
这适用于每个平台,并且我可以以编程方式检查更新或等待服务人员自己执行更新(尽管它的检查时间因平台,设备和其他未知因素而有很大差异。通常不超过24个小时)。
小智 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 上可见。
| 归档时间: |
|
| 查看次数: |
4804 次 |
| 最近记录: |