2010-11-20 93 views
5

我已经编写了基本的密码管理器类型网络应用程序,以在移动设备上进行脱机运行(在第4代iPod Touch上进行测试)。我已将应用程序添加到主屏幕,并且在iPod处于联机状态时它可以正常工作,并且可以连接到服务器。有一次,我把iPod的下线,当我打开应用程序下面的对话框出现:无法让网络应用程序在iPod上脱机工作

无法打开PwdThing

PwdThing无法打开,因为它没有连接到互联网

对于应用程序(passwordthing.html)的单一静态的HTML文件指向清单文件:

<html manifest="cache.manifest"> 
... 

cache.manifest文件包括由应用程序(包括jQuery Mobile文件)使用的所有文件:

CACHE MANIFEST 
passwordthing.html 
passwordthing.js 
... 

而且cache.manifest文件被设置在.htaccess文件中担任text/cache-manifest

AddType text/cache-manifest .manifest 

所有源文件在Githubthis commit是撰写本文时的版本),我也设置了一个public server来安装它。

为什么我无法让我的应用程序脱机工作?

+2

您应该将chrome指向您的应用程序以查看是否收到了任何缓存错误。 – hvgotcodes 2010-11-20 02:31:18

+0

@hvgotcodes我刚刚发现缓存错误(错误的文件名),如果您可以根据您的评论添加新的答案,我会接受它:-) – 2010-11-20 03:02:06

+0

完成 - 您仍然可能希望始终在每个版本中更改您的清单名称。否则,文件可能会更改,但名称保持不变,并且不会更新。 – hvgotcodes 2010-11-20 03:09:21

回答

2

我能想到的唯一的事情就是您没有更改文件,移动Safari浏览器已经缓存了旧版本的清单。为您的清单添加评论。您可能还想尝试更改清单文件本身的名称;我必须这样做才能让我的iPad缓存 - 每次我更新我的应用程序时,我都会更改清单的名称以包含日期。

请注意,iOS4.2有更好的清单支持。当它出现时,你可能会看到情况有所改善。

编辑 - 或者事实证明,它只是一个错误的文件名。 ;)(见关于问题的评论)。

+0

谢谢,试图改变清单文件名,但没有区别:-( – 2010-11-20 02:48:31

+0

@ben你尝试加载你的应用程序在铬和看着控制台? – hvgotcodes 2010-11-20 03:01:09

1

[下面复制my answer from here,因为它可以在这里申请:]

我发现调试HTML5离线应用程序是一个痛苦。我发现从本文的代码帮助我弄清楚什么是错的我的应用程序:

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

调试HTML 5脱机应用程序缓存 由乔纳森·斯塔克

如果您正在寻找提供离线访问您的Web应用程序,HTML5中提供的离线应用程序缓存就是杀手锏。然而,这是一个巨大的PITA来进行调试,尤其是如果你仍然试图绕开它的话。

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

如果您有任何疑问,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); 
0

此外,确保cache.manifest有正确的物料清单(对我来说UTF-8),在HTML文件相匹配的。如果您只有一个非BOM的ASCII文件,并且内容类型设置为UTF-8,则缓存将失败

HTH某人。

Christine Boersen

相关问题