离线iOS Web应用程序:加载我的清单,但不能脱机工作

我正在编写一个在iOS上离线使用的Web应用程序。 我创build了一个清单,将其作为text/cache-manifest ,并且在Safari中运行时通常工作正常。

如果我把它作为一个应用程序添加到我的主屏幕,然后打开飞行模式,它根本无法打开应用程序 – 我得到一个错误,它提供closures应用程序。 (我认为这是一个离线应用程序的全部目的!)

  • 在线上第一次加载应用程序时,我可以在我的日志中看到它正在请求清单中列出的每个页面。

  • 如果我closures飞行模式,并加载应用程序,我可以看到它所请求的第一个文件是我的main.html文件(这是清单中列出,并具有manifest=...属性)。 然后它要求清单和我所有其他文件,获得200的所有(和304的任何事情要求在此负载第二次)。

  • 当我在Chrome中加载页面时,点击左右,日志显示它试图到达服务器上的唯一东西是“/favicon.ico”(这是404,而我不认为iOS Safari会加载,无论如何)。 清单中列出的所有文件都是有效的,并且没有错误地提供。

  • Chrome检查员在“APPLICATION CACHE”下列出了我所期望的所有已列出的caching文件。 整套文件大约是50 KB,在我发现的任何离线资源限制下都是如此。

这是应该工作,即,我应该能够创build一个离线的iOS应用程序只使用HTML / CSS / JS? 我在哪里去弄清楚为什么它不能脱机工作?

(相关,但对我来说听起来不太一样,因为它是关于Safari,而不是一个独立的应用程序:“ 不能让一个Web应用程序脱机工作在iPod上 ”)

我确认名字“cache.manifest”解决了IOS 4.3中的离线caching问题。 其他的名字根本不起作用。

我发现debuggingHTML5离线应用程序是一个痛苦。 我发现这篇文章中的代码帮助我找出了我的应用出了什么问题:

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

debuggingHTML 5脱机应用程序caching由Jonathan Stark

如果您希望提供离线访问您的Web应用程序,HTML5中提供的离线应用程序cachingfunction就是杀手锏。 然而,这是一个巨大的PITAdebugging,特别是如果你仍然想要解决它的问题。

如果您正在使用caching清单,请将以下JavaScript添加到主HTML页面,并使用Firefox中的Firebug或Safari中的debugging>显示错误控制台在控制台中查看输出。

如果您有任何疑问,请在PLMK中留言。

HTH,
Ĵ

 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); 

有时,应用程序caching组在MobileSafari中进入错误状态 – 它下载caching中的每个项目,然后在最后触发通用caching错误事件。 根据规范,应用程序caching组基于清单的绝对URL。 我发现,当这个错误发生时,改变清单的path(例如,cache2.manifest等)为您提供了一个新的caching组,并规避了这个问题。 我可以保证,我们所有的networking应用程序都以4.2和4.3的全屏幕离线工作。

当使用<meta name="apple-mobile-web-app-capable" content="yes" /> ,没有离线的networking应用程序(从iOS 4.2开始)可以在没有互联网连接的情况下运行(也就是飞行模式) HTML头部分。 我已经validation了每一个我见过的例子和那些使用Safari来渲染网站的工作正常,但是当你扔在元标记,它将无法正常工作。 尝试没有它的应用程序,你会明白我的意思。

我发现在启用飞行模式之后清除Safaricaching是testing应用程序是否真正离线运行的有效方式。

我有时被愚弄,认为应用程序caching工作时,它不是。

我有几个工作离线和离线的networking应用程序。

当我closures机场模式时,我收到了清单和其他一些文件的请求。

我没有得到图片,JavaScript,CSS或caching的AJAX文件的请求。

如果你看到你的资源请求,IOS 没有caching它们。

一般来说,safari的体验比较挑剔。

我build议你在电脑上试试Safari。

我今天在iOS 4.3上遇到了同样的问题。 我能够通过添加一个favicon.ico文件并将其添加到清单来解决这个问题。

我已经写了一个离线的应用程序,似乎仍然在4.2和4.2.1; 该post有点灰尘,但代码仍然运行:

http://kentbrewster.com/backchannel/

雷米夏普有一个新的职位,代码也可以,在这里:

http://remysharp.com/2011/01/31/simple-offline-application/

他的应用:

http://rem.im/boggle/

经过几天的时间,使用networking服务器的HTTPauthentication让离线的networking应用程序在iPhone / iPod Touch上工作,我发现了这些有用的东西:

  1. 点击“添加到主屏幕”时,确保Safari位于Web应用程序的URL根目录下。 我使用jQuery Mobile,有时会添加“/#pageId”链接。 造成麻烦。

  2. 串行运行Ajax调用。 如果您的networking应用程序使用HTTP身份validation,这可能是非常重要的,但是我的应用程序并行地在页面加载时触发了大量的Ajax调用,并导致应用程序挂在“apple-touch-startup-image”上。

  3. 离线时Ajax调用“成功”(至less使用Prototype.js )。 testingAjax响应中的实际数据,而不仅仅是HTTP状态。 我用它来testing显示caching(SQL)或实时数据。

  4. 在清单中使用“NETWORK:\ n * \ n”。 从我所能得到的结果来看,这是对“CACHE:”部分中没有明确表述的任何声明。 使用Chrome来确保您的清单是正确的。 看看Chrome的控制台的错误。

  5. 不直接相关,但绊了我一下,openDatabase.transaction()调用是asynchronous! 意思是,事务之后的JS代码行( execute()error()success() )将在success()函数之前执行。

祝你好运!

自从我从4.2更新我的iPad到4.3.1以来,我一直在为这个iOS 4.3“没有脱机caching”而苦恼。 我在这个网站的另一篇文章中看到它在4.3.2中再次运行。 所以我再次通过iPad更新,现在到iOS 4.3.3。 但是,直到我将清单文件重命名为“cache.manifest”之后,仍然无法使用脱机caching。 然后caching再次开始工作,我可以从主屏幕上运行我的HTML5离线应用程序。 我不需要将favicon.ico放入caching清单。 我也有全屏幕(设置“苹果手机networking应用程序function”为“是”)。

我发现这个解决scheme似乎对我很有用,因为我在开发过程中遇到了这个问题。 目前为止,这个修补程序对我来说工作得很好,对于我要求testing的其他人也适用,并且能够在离线(在飞行模式下)和离开主屏幕后进行运行。 我在我的网站上写了一篇文章:

http://www.offlinewebapp.com/solved-apple-mobile-web-app-capable-manifest-error/

  1. 在主屏幕上删除当前的networking应用程序图标。
  2. 转到设置并清除您的Safari浏览器caching。
  3. 双击您的主页button打开多任务栏。 find一个Safari,按住你的手指,并退出它。

请让我知道如果这也适用于你! 祝你好运!

我写了一个应用程序,它通过手机浏览器正常工作,但是当添加桌面…没有工作。 我想苹果已经放弃了IOS4,所有的努力现在在OS5上。 耻辱:(

我有一个潜在的解决方法 – 这似乎有点疯狂,但这里去…我一起工作的cache.manifest和全屏应用了很多(这里是一个testing,如果你需要: http ://www.mrspeaker.net / 2010/07/12 / argy-bargy / – 添加到主屏幕,然后打开飞行模式,并启动 – 至less,从iOS 4.2.1开始)

我发现的一个奇怪的事情是,有时似乎在文件中的某种“元”信息可以把它们从被caching弄乱 – 你有没有注意到,在bash中,如果你做一个“ls”一些文件(取决于你的颜色设置)突出显示没有明显的原因? 文件可以有操作系统(我认为)自动添加的元数据 – 有办法删除它…我不记得为什么,但这里有一些更多的细节: 从雪豹文件中删除元数据

有一天我的头发被撕掉了 – 拒绝放弃,因为我知道它应该已经工作了…… Chrome浏览器说它已经加载了所有的文件,但是以一个普通的错误结束。 最后,我用空白文件重新创build项目结构,并复制/粘贴内容。 它工作 – 开始caching,因为它应该!

当我看到我注意到的文件有一些元信息。 我试图擦洗这个信息,原来的项目再次工作。 我不确定这是否是再次发生的原因 – 也许这只是一个巧合。

因为它工作,我没有想太多。 几个月后再次发生同样的问题,复制/粘贴技巧再次工作。 我很忙,所以我没有进一步调查 – 但发誓下一次发生的时候我会发现它的底部….但我还没有。

唷。 无论如何,很高兴我能把它写下来

[更新:几个月和几个月后 – 我还没有能够重现这一点,所以我不认为这是元数据]