Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
永久重定向iOS主屏幕Web应用_Ios_Html_Application Cache - Fatal编程技术网

永久重定向iOS主屏幕Web应用

永久重定向iOS主屏幕Web应用,ios,html,application-cache,Ios,Html,Application Cache,我有一个使用Sencha Touch的单页web应用程序,它已经添加到大约2000台iPad的主屏幕上。我希望更改web应用程序的URL,而不要求所有用户从主屏幕删除启动图标,转到新URL,然后再次将其添加到主屏幕。该应用程序还使用缓存清单来缓存HTML、CSS、JavaScript和图像,并且该应用程序能够完全脱机工作 在iOS中添加到主屏幕的网页似乎确实像预期的那样响应HTTP 301(永久重定向),但我发现在iPad2设备上的iOS 8中,这种行为很奇怪,我将在下面描述。我创建了一个ASP

我有一个使用Sencha Touch的单页web应用程序,它已经添加到大约2000台iPad的主屏幕上。我希望更改web应用程序的URL,而不要求所有用户从主屏幕删除启动图标,转到新URL,然后再次将其添加到主屏幕。该应用程序还使用缓存清单来缓存HTML、CSS、JavaScript和图像,并且该应用程序能够完全脱机工作

在iOS中添加到主屏幕的网页似乎确实像预期的那样响应HTTP 301(永久重定向),但我发现在iPad2设备上的iOS 8中,这种行为很奇怪,我将在下面描述。我创建了一个ASP.NET MVC网站,并将其部署在同一个URL下,替换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请求)

  • 当我在运行iOS5的iPad1上测试时,它的工作原理和我预期的完全一样。一旦下载并缓存了来自新URL的资源,它总是从该点发出来自新URL的每个请求。我可以将该设备置于飞行模式,该应用程序在离线状态下运行良好

  • 这就是奇怪行为开始的地方,我只在运行iOS 8.x的iPad上看到这一点(我没有任何设备运行iOS 6或7)。然后按下home(主页)按钮关闭应用程序,然后从主屏幕图标重新启动它。当我重新启动应用程序时,它最初总是返回到旧的URL(iOS 5总是返回到新的URL),这很奇怪,因为以前的HTTP 301应该阻止这一点。从这里可以看到两种可能的行为:

  • 5a。有时,它将只请求来自旧URL(根URL)的HTML页面,在这种情况下,它将获得另一个HTTP 301,然后重定向到新URL,请求缓存清单,然后加载应用程序。从那时起,当我打开和关闭应用程序时,它将不再向旧URL发出请求。当我将设备置于飞行模式时,该应用程序在离线状态下运行良好。我有两台运行iOS 8.3和8.4的iPad2,这种情况在这些设备上的发生率约为50%

    5b。其他时候,它不那么好用。从新URL下载缓存资源后重新启动应用程序时,它将返回到旧URL,不会请求HTML页面,而是请求cache.manifest以及CSS和JavaScript。Cache .Mault请求将导致另一个HTTP 404,但是如果我继续关闭并重新打开应用程序,它将永远不会认为缓存已经过时,并且不会再次请求HTML页面。有趣的是,我只能在ipad2s上重现这一点。我有一台运行iOS 8.3的iPad Air 1,我在那台设备上只见过5a

  • 对于5b中描述的情况,它确实请求JavaScript文件。因此,我进入了一个JavaScript文件,并将其放入window.location.reload(true),这会导致它请求HTML页面,从而生成另一个HTTP 301。现在,当这种情况发生时,它确实会将其发送到新的URL,但每次我关闭并重新打开应用程序时,它都会重复整个循环。它转到旧的URL,获取JavaScript,重新加载,获取301,然后转到新的URL。当我将设备置于飞行模式并打开应用程序时,它无法工作
  • 我发现,如果我将iPad2置于飞行模式,并以旧的URL运行应用程序,然后再次运行,对cache.manifest执行404,对HTML执行301,那么5a将始终出现。这听起来像是iOS 8中的一个bug(可能在6和7中也存在),我正试图找出一个解决方案,我可以在我的ASP.NET MVC网站中实现,以重定向到新的URL,该URL将在100%的时间内工作


    任何见解都将不胜感激。

    我想出了避免这种古怪行为的方法。如上所述,应用程序正在侦听applicationCache上的“过时”事件,然后调用window.location.reload(true)再次抓取页面并获取301。我发现,如果我不重新加载同一个页面,而是重定向到另一个页面,然后再重新加载,那么它在100%的时间内都能正常工作。它重定向到新的URL,缓存资源,然后再也不会请求旧的URL。我还发现,关闭应用程序并在缓存被淘汰后再次打开应用程序也有同样的效果。

    这个问题非常冗长。您是否有一个代码示例,说明您遇到问题的地方不起作用?