WebView显示从原始源获取WebArchive

时间:2012-08-15 11:58:59

标签: macos cocoa caching webview webarchive

(抱歉标题不好) 我有一个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];
  • 但没有成功。 (对于长篇描述感到抱歉)

0 个答案:

没有答案