在iOS中添加到主屏幕时,HTML5networking应用程序无法caching

要清楚,网页应用程序caching,并在移动Safari中脱机工作正常。

问题是当它被添加到iPhone 4s和iPad 2上的主屏幕上,两者都运行iOS 6.0.1。 它不会脱机工作,并提供networking错误连接到互联网,即“无法打开MYWEBAPP MYWEBAPP无法打开,因为它没有连接到互联网”

我已经debugging了几个小时,似乎无法find解决scheme。 我没有收到控制台中的任何错误,我正在运行Jonathan Stark的debugging代码

我已经在桌面Safari,Chrome和Firefox的在线/离线开发者工具中testing了该应用。 以及使用Safari中的设备的Web Inspector。 iPhone或iPad的结果是一样的。 他们将cachingnetworking应用程序,并将在移动Safari,但不是添加到主屏幕时工作。 没有线上或线上的错误。

据我所知,我正在使用最佳实践:

  1. 添加了HTML标头: <html manifest="photo.appcache">

    我也试验过使用不同名称的清单文件,包括:cache.manifest和offline.manifest,因为我读到它有所作为,但在我的testing中,只要扩展名是什么名称都没有关系。清单或.appcache,并在.htaccess文件中适当地提供。

  2. 添加了正确的MIMEtypes: AddType text/cache-manifest appcache manifest

    我也试过: AddType text/cache.manifest manifestAddType text/cache.manifest .manifest manifestAddType text/cache-manifest .manifest

    我不相信这个工作: AddType text/cache.manifest但我不记得。 在大多数情况下,这并不重要,我坚持:

    AddType文本/caching清单appcache清单

    就像HTML5 Mobile Boilerplate中那样。

  3. 添加:

networking:*

到appcache文件。 我相信这可以让所有的下载以及使所有的链接工作。

  1. 我已经尝试删除这一行: <meta name="apple-mobile-web-app-capable" content="yes">因为我在这里读到了解决了类似于我的问题,但我可以确认它在我的testing中不起作用。 按住主屏幕图标时,删除此行或将内容设置为“否”将redirect到Mobile Safari,而不是全屏打开。

我已经把它缩小到它是一个在iOS 6中的错误(我实际上使用的是iOS 6.0.1),因为我知道现在浏览器中的Web应用程序的数据已经分离了,并且添加到主屏幕。 我在这里发布这个问题,看看是否有其他开发者遇到同样的问题。

我已经解决了这个问题。 我推荐以下iOS 6的主屏幕networking应用程序。

出于testing目的,请使用Web Inspector和Jonathan Stark的一个漂亮的JS脚本来了解应用程序在Mobile Safari中的caching时间:

http://jonathanstark.com/blog/debugging-html-5-offline-application-cache?filename=2009/09/27/debugging-html-5-offline-application-cache/

成功caching后,将该应用程序添加到主屏幕并保持打开状态,以便将主屏幕版本单独caching。 它必须完全caching才能脱机工作。

由于我的应用程序caching是22MB的数据,并且数据的caching对于Web应用程序是单独的,所以我的问题是没有离开主屏幕应用程序打开足够长的时间来caching。

就用户体验而言,这是非常糟糕的,而且数据是分开的。 我可以确认这一点,因为如果你从Safari中删除网站数据,主屏幕的Web应用程序仍然会运作。

据我所知,没有一种方法可以debugging为主屏幕Web应用程序caching的数据或存储位置。

上面的答案非常有帮助。 @aul说,他不知道debugging主屏幕的Web应用程序的方式,但我find了一种方法。

将iPad或iPhone连接到计算机,然后在Safari中转到开发>并select您的设备。 您的主屏幕应用程序必须打开才能显示在下拉菜单中。 一旦你访问应用程序,你可以打开错误控制台,观看乔纳森·斯塔克的脚本去工作。 一旦清单被下载,您将可以在离线模式下使用该应用程序。

这个脚本让生活更轻松! 感谢@保罗!

 var cacheStatusValues = []; cacheStatusValues[0] = 'uncached'; cacheStatusValues[1] = 'idle'; cacheStatusValues[2] = 'checking'; cacheStatusValues[3] = 'downloading'; cacheStatusValues[4] = 'updateready'; cacheStatusValues[5] = 'obsolete'; var cache = window.applicationCache; cache.addEventListener('cached', logEvent, false); cache.addEventListener('checking', logEvent, false); cache.addEventListener('downloading', logEvent, false); cache.addEventListener('error', logEvent, false); cache.addEventListener('noupdate', logEvent, false); cache.addEventListener('obsolete', logEvent, false); cache.addEventListener('progress', logEvent, false); cache.addEventListener('updateready', logEvent, false); function logEvent(e) { var online, status, type, message; online = (navigator.onLine) ? 'yes' : 'no'; status = cacheStatusValues[cache.status]; type = e.type; message = 'online: ' + online; message+= ', event: ' + type; message+= ', status: ' + status; if (type == 'error' && navigator.onLine) { message+= ' (prolly a syntax error in manifest)'; } console.log(message); } window.applicationCache.addEventListener( 'updateready', function(){ window.applicationCache.swapCache(); console.log('swap cache has been called'); }, false ); setInterval(function(){cache.update()}, 10000); 

我有两个部分的问题。 我正在使用ASP.NET MVC / Razor生成我的caching清单,因为我希望能够轻松地将该站点托pipe在虚拟应用程序之外,并且仍然有path排列。 caching清单中的内容types没有正确设置,因此Internet Explorer和Safari(iOS)不能识别它(即使PC和Android上的Chrome也是如此)。

一旦我解决了这个问题,当我尝试使用iOS Safari访问Azure托pipe的应用程序时,仍然无法正常工作。 当我尝试访问Internet Explorer时,我看到它没有正确的MIMEtypes的字体我有。

所以有一个警告的话:绝对肯定不仅是清单的哑剧types,而且是清单所依赖的所有文件。

Interesting Posts