HTML5应用缓存在iOS 11.3上停止工作。

3
我们现在知道这是IOS 11.3的问题,似乎只针对iPad。

通过appcache请求资源时,cookies被丢弃。如果您的资源处于某些身份验证之后,它们将被重定向到您的身份验证页面。

如苹果所述,我们尝试了实验功能开/关。

删除资源的身份验证不是一个有效的永久选项。

我们正在寻找解决方案,同时希望下一个版本的IOS能够修复这个问题,这似乎是11.4 beta 2的情况。更改应尽可能少以减少风险。

以下信息是我们尝试解决问题时经历的过程。迄今为止,没有尝试过有效的解决方案。Service Workers是最可行的路径。

第1天
我们有一个应用程序,在生产中运行良好(自上次部署以来已经有一年时间)。

我们的应用程序使用app cache在wifi不可用时启用离线模式。 我们的应用程序主要在iPad上使用Safari和一些Surface Pro上使用Chrome。目前大多数情况报告的是iPad。

最近几天,越来越多的用户开始在加载缓存时遇到问题。我们已经能够在 iPad 上重现这个问题(更新到了 11.3 版本后出现,但在 iPhone 11.3 上无法重现),并使用 Google Chrome 桌面版隐身模式在 dev 机器上测试。该应用程序可以在我们的一个旧 iPad 上正常工作,该 iPad 版本为 10.3.3。

-- 应用程序缓存错误事件:资源获取失败 (2) http://localhost:63330/client/vendor/kendo-ui/kendo.all.js--

事实
- 它总是在同样的文件上阻塞,经过一些测试,似乎所有大于 1.2MB 的文件都会出现此问题,例如 kendo 是 4.7MB,而压缩后的文件是 1.7MB。
- Fiddler 没有报告任何错误,所有文件状态响应都是 200。

猜想
1. Safari 和 Chrome 的更新可能已更改
2. iPad 管理员可能已更改设置
3. Windows 或 iOS 的更新可能已更改某些设置

由于Safari和iOS在同一发布日期(2018年3月29日)发布,它们可能是相关的,最有可能的猜测是,有人知道为什么会发生这种情况吗?

在Apple支持页面上找不到11.3更改的详细信息
https://support.apple.com/en-ca/HT208067
https://support.apple.com/en-ca/HT201222

更新:2018年4月9日星期一
我们已经能够通过调试iPad和Mac mini来重现该问题。然而,问题是不同的,因此我们目前放弃了在我们的桌面Chrome中找到的内容。

以下是新的事实:

  • 使用appcache下载文件时未提供Cookie。第一个文件请求被拒绝并重定向到登录页面。

[警告] ApplicationCache已被弃用,请改用ServiceWorkers。(192.168.0.152,第2行)
[错误] 无法加载资源:服务器响应了401(未经授权)的状态(cache.manifest,第0行)
[错误] 应用程序缓存清单无法获取,因为清单具有401响应。
[错误] 2018-04-09 12:01:51:APPLICATION CACHE错误
logMsg(logDecorator.js:111)
error(logDecorator.js:128)
(匿名函数)(applicationCacheUpdateSrv.js:121)
分派(jquery-1.10.2.js:5109)
处理(jquery-1.10.2.js:4780)

- 解决身份验证后的影响,我们在IDBDatabase方面遇到问题,可能与我们删除的Authorization相关(目前正在调查中)

IndexedDB请求错误(获取所有报告)-> NotFoundError:在“IDBDatabase”上执行“transaction”失败:找不到指定的对象存储。

我们使用Charles Proxy for Mac找到了这个问题。因此,我们取消了对静态文件和主页的身份验证。这似乎有效,但我们的文件将会是公开的,这不是一个真正的选择。
类似的问题: Cache-Manifest 如何处理身份验证cookie? 2018年4月10日更新
IndexDB错误与此无关。由于缺少授权,数据库未正确初始化。
我们目前添加了一个替代主页,不需要授权,而不是从默认主页中删除授权。它将被manifest cache调用并正确下载。 2018年4月12日更新
我们试图保护静态文件,最终在查询URL中添加了一个令牌。虽然它可以工作并且我们可以验证请求(请注意,由于我们没有cookie来验证用户,身份验证远非完美),但URL现在与缓存的主页中请求的URL不同,并使自定义身份验证本身毫无价值。
我们需要根据用户生成的令牌,重写所有缓存页面的URL。在我们的情况下,这涉及抛弃ASP.Net MVC Bundle功能,可能要制作自定义功能?此时,我们认为尝试ServiceWorker可能会更容易,因为appcache已被弃用。但这并不能保证cookie会随着ServiceWorker传递...
更新于2018年4月19日星期一:我们昨天从苹果那里得到了一些回复。他们建议我们在“设置”>“Safari”中尝试“防止跨站点跟踪”属性(开和关都试一下),还要在“设置”>“Safari”>“高级”>“实验性”中尝试实验性功能(提到了ServiceWorkers,但是我们都试过了)。
不幸的是,目前这对我来说没有改变任何事情。
注:划掉了一些与问题直接无关的部分。
更新于2018年5月25日星期五:添加了一个部分来总结情况并使问题更加明确。

我正在处理完全相同的问题 - 目前还没有找到解决方案。 - Michal Krawiec
1
@MichalKrawiec 我最近看到了这个视频,展示了ServiceWorkers的使用,它似乎比我们最初想象的要容易得多。希望它能对你有所帮助。 - Kadgiko
1个回答

2
截至2018年4月25日,我们尝试了iOS 11.4 beta版本,似乎已经解决了问题。根据部署时间表,大约一个月后应该会发布,具体请参考此处
然而,在那之前,转向使用Service Workers可能是个好主意。这里有来自Google的示例。这里有一段介绍这个主题的视频。
如果我们转向使用Service Workers,我会添加一个示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接