【发布时间】:2015-12-11 20:38:03
【问题描述】:
我有一个使用 Sencha Touch 的单页 Web 应用程序,该应用程序已添加到大约 2000 台 iPad 的主屏幕上。我希望更改 Web 应用程序的 URL,而不需要所有这些用户从主屏幕删除启动图标,转到新 URL,然后再次将其添加到主屏幕。该应用还使用缓存清单来缓存 HTML、CSS、JavaScript 和图像,并且该应用能够完全离线工作。
在 iOS 中添加到主屏幕的网页似乎确实像预期的那样响应 HTTP 301(永久重定向),但我发现 iPad 2 设备上的 iOS 8 中的行为很古怪,正如我将描述的那样。我创建了一个部署在同一 URL 下的 ASP.NET MVC 网站,替换了 Sencha Touch 应用程序以完成永久重定向。这是我正在使用的过程和我看到的行为:
从旧 URL 启动应用时,它只请求 cache.manifest,我返回 HTTP 404 以使应用停止缓存。
-
应用程序加载,我在应用程序的 JavaScript 中有一个事件处理程序,用于调用 window.location.reload(true) 的 applicationCache“过时”事件。然后应用程序将重新加载,这一次将请求先前缓存的 HTML 页面(托管在 URL 根目录),然后我的 ASP.NET MVC 站点将返回 HTTP 301 以永久重定向到新 URL。
一旦应用点击新 URL,它就会开始从新 URL 处的 cache.manifest 下载资源。我在“updateready”applicationCache 事件上有一个事件处理程序,它将调用 window.location.reload(true) 并重新加载应用程序。应用重新加载后,它将按预期从新 URL 请求所有资源(对服务的 XHR 请求)。
当我在运行 iOS 5 的 iPad 1 上对此进行测试时,结果完全符合我的预期。一旦下载并缓存了来自新 URL 的资源,它总是从该点发出来自新 URL 的每个请求。我可以将设备置于飞行模式,该应用在离线时也能正常运行。
这是古怪行为开始的地方,我只在运行 iOS 8.x 的 iPad 上看到这一点(我没有任何运行 iOS 6 或 7 的设备)。然后我通过按主页按钮关闭应用程序并从主屏幕图标重新启动它。当我重新启动该应用程序时,它最初总是会回到旧 URL(iOS 5 总是会转到新 URL),这很奇怪,因为之前的 HTTP 301 应该阻止了这种情况。从这里开始,有两种可能的行为:
5a。有时,它只会从旧 URL(根 URL)请求 HTML 页面,在这种情况下,它将获得另一个 HTTP 301,然后重定向到新 URL,请求缓存清单,然后加载应用程序。从那里开始,当我打开和关闭应用程序时,它再也不会向旧 URL 发出请求。当我将设备置于飞行模式时,该应用程序在离线时运行良好。我有两台运行 iOS 8.3 和 8.4 的 iPad 2,在这些设备上大约 50% 的时间会发生这种情况。
5b。其他时候,它的效果不是很好。从新 URL 下载缓存资源后重新启动应用程序时,它将回到旧 URL,不会请求 HTML 页面,而是会请求 cache.manifest 以及 CSS 和 JavaScript。 cache.manifest 请求将导致另一个 HTTP 404,但如果我继续关闭并重新打开应用程序,它将永远不会认为缓存已过时,也不会再次请求 HTML 页面。有趣的是,我只能在 iPad 2s 上重现这一点。我有一台运行 iOS 8.3 的 iPad Air 1,但我只在该设备上看到 5a。
- 对于 5b 中描述的情况,它确实请求 JavaScript 文件。因此,我进入了一个 JavaScript 文件并放入了 window.location.reload(true),这会导致它请求 HTML 页面,这会导致另一个 HTTP 301。现在,当这种情况发生时,它确实会将其发送到新的URL,但每次我关闭并重新打开应用程序时,它都会重复整个循环。它转到旧 URL,获取 JavaScript,重新加载,获取 301,然后转到新 URL。当我将设备置于飞行模式并打开应用程序时,它不起作用。
我发现如果我将 iPad 2s 置于飞行模式并在旧 URL 中运行应用程序,然后再次运行它并为 cache.manifest 执行 404 并为 HTML 执行 301,那么 5a 将始终出现。这听起来像是 iOS 8 中的一个错误(可能也存在于 6 和 7 中),我正在尝试找出一种解决方法,我可以在我的 ASP.NET MVC 网站中实现以重定向到可以工作的新 URL 100 % 的时间。
任何见解都将不胜感激。
【问题讨论】:
-
这个问题很啰嗦。您是否有遇到问题的代码示例?
标签: ios html application-cache