(抱歉标题不好) 我有一个WebView,我从以前保存的WebArchive加载。存档/网页是带有一些JavaScript(用于菜单)和一些图像(没有什么特别或奇怪的)的html。
我将页面保存到WebArchive,更改网站中的图像(相同名称,不同内容),重新加载原始WebArchive但WebView显示当前(在线)状态(如果这样做,则更好的解释如下)没有意义)。
似乎正在发生的事情是WebView / Archive正在获取图像的在线版本(可能还有其他资源)而不是WebArchive中的资源。如果我使在线站点脱机并再次尝试,WebView将显示WebArchive中的资源(即保存存档时的状态)。
我已尝试在WebView中使用不同的缓存设置(以及通过WebView委托的NSURLRequest)。
当我在Safari中查看存档时,行为是相同的。例如在线网站可用,在Safari中打开已保存的存档,并显示资源的在线版本。使在线站点不可用并再次打开存档,并使用缓存的资源版本(即刚刚显示的在线版本 - 而不是WebArchive中的那些)。刷新显示存档的页面(在线站点不可用),资源将恢复为存档中保存的资源。
网页使用大量相对寻址(例如图像“/images/pic.png”)。在WebResourceLoadDelegate中,资源URL显示为例如“/images/pic.png”和mainDocumentURL为“/".
对于应用程序,重要的是我使用/显示使用存档保存的资源而不是任何更新的缓存/在线版本。任何想法我如何实现这一点(或我可能做错了)。
对上述案例中发生的事情进行更详细的解释更有意义: 应用程序是保存完整的网页(使用WebView获取并保存为WebArchive)。应用程序获取网页并保存。在线网站改变资源的内容(例如,/ images / pic.png具有相同的名称,但包含不同的图像数据)。然后,应用程序从之前加载WebArchive并将其显示在WebView中。页面显示正常,但例如/images/pic.png是在线版本,而不是WebArchive中保存的版本。关闭申请。使在线网站不可用(例如停止Apache服务器)。重新运行应用程序,从之前重新加载相同的WebArchive,而/ images / pic.png是来自存档的。即WebView似乎试图获取资源的在线版本而不是WebAchive中存储的版本。 Arc hive盯着文件。要显示文件 - > NSData-> WebArchive-> WebView / loadArchive。
NSData *pageData=[[NSData alloc]initWithContentsOfFile:pageDataFileAsString];
WebArchive *webArchive=[[WebArchive alloc]initWithData:pageData];
[[targetWebView mainFrame]loadArchive:webArchive];
注意:它实际上更奇怪/复杂,因为(更详细),应用程序实际上如上所述显示,但两个WebView包含存档的“之前”和“之后”。而且它们似乎互相缓存(所以“/images/pic.png”加载到其中一个将由另一个使用 - 所以对于包含不同/images/pic.png的两个不同的档案,两个资源显示相同。
我尝试过使用WebView WebResourceLoadDelegate来强制从原点加载所有内容,即
- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource {
NSMutableURLRequest *newRequest=[request mutableCopy];
[newRequest setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
return(newRequest);
}
还设置WebView首选项以停止缓存
[webPreferences setUsesPageCache:FALSE];
[webPreferences setCacheModel:WebCacheModelDocumentViewer];
[webView setPreferences:webPreferences];