【问题标题】:How to download a web page with it's inner resoures like images,css in iOS?如何在iOS中下载带有图像、css等内部资源的网页?
【发布时间】:2013-04-12 07:08:31
【问题描述】:

我正在尝试将指定的网页及其内页资源下载到磁盘。 当我发送 NSURLRequest 时,只会请求初始 URL,但不会下载图像、css、js 等资源。

有人建议使用缓存,但我不想缓存在uiwebview中浏览的每个网页,而只缓存我指定的一个。例如,当我输入一个url到uiwebview地址栏然后点击“保存"按钮,整个页面会被保存,但是webview中的其他浏览不会被自动缓存。

有没有办法下载整个网页? 非常感谢!

【问题讨论】:

  • 我知道这是一个愚蠢的问题.. 但是您是从指定的服务器下载网页及其信息吗?
  • 我的意思是将某些 URL 与页面资源一起保存到磁盘。不是缓存每个页面,也不是来自指定的服务器。

标签: ios objective-c http nsurlrequest nsurlcache


【解决方案1】:

我曾经遇到过同样的问题,我使用 ASIWebPageRequest 解决了它。当时它已经很旧了,但仍然有效。

我写了一个方法(基于示例方法)用于下载文件夹中的网页。您需要对其进行修改才能使其正常工作。

- (IBAction)loadURL:(NSURL *)url inFolder:(NSString*)folderPath
{
    // Assume request is a property of our controller
    // First, we'll cancel any in-progress page load
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    [[self request] setDelegate:nil];
    [[self request] cancel];

    [self setRequest:[ASIWebPageRequest requestWithURL:url]];
    [[self request] setDelegate:self];
    [[self request] setDidFailSelector:@selector(webPageFetchFailed:)];
    [[self request] setDidFinishSelector:@selector(webPageFetchSucceeded:)];

    // Tell the request to embed external resources directly in the page
    [[self request] setUrlReplacementMode:ASIReplaceExternalResourcesWithData];

    self.theCache.storagePath = folderPath;


    // It is strongly recommended you use a download cache with ASIWebPageRequest
    // When using a cache, external resources are automatically stored in the cache
    // and can be pulled from the cache on subsequent page loads
    self.request.cacheStoragePolicy = ASICachePermanentlyCacheStoragePolicy;
   [[self request] setDownloadCache:self.theCache];

   // Ask the download cache for a place to store the cached data
   // This is the most efficient way for an ASIWebPageRequest to store a web page
   //[[self request] setDownloadDestinationPath:
   //[[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:[self request]]];
   [[self request] setDownloadDestinationPath:[self.theCache pathToStoreCachedResponseDataForRequest:[self request]]];

   [[self request] startAsynchronous];

}

我也用过ASIDownloadCache。

...
    ASIDownloadCache *localCache = [[ASIDownloadCache alloc] init];
    self.theCache = localCache;
...

【讨论】:

  • 先谢谢!我曾经试过ASIWebPageRequest,但它总是执行不正确,有人说它不完整,不成熟。你使用它怎么样?
  • 我只是用它来下载一个网页,包括它的 css 和图像。仅此而已,并且工作正常。我不能说它是否不成熟,但肯定是过时的,你需要为这些文件禁用 ARC 来构建项目。所以如果你不想用,​​也许你可以检查实现并编写自己的代码(我也会尝试这样做)。
  • 如果你要使用基于 ASIWebPageRequest 的解决方案,我会通过 @pokeb (ASIHTTPRequest) 检查这个项目 github.com/pokeb/ProxyingUIWebView 以获得一些灵感 ;-)
  • ASIWebPageRequest 是真正的经典
  • ASIHTTPRequest 是经典,但现在完全被 AFNetworking 取代
【解决方案2】:

您可以实现自定义 NSUrlCache 并保存所有内容。使用 NSUrlRequest 下载的所有内容都将使用 NSUrlCache。 UIWebView 所做的一切都使用 NSUrlRequest。如果您需要样品,请查看https://github.com/evermeer/EVURLCache

【讨论】:

  • 谢谢!但是我不想缓存在uiwebview中浏览的每一个网页,而只缓存我指定的一个。例如,当我输入一个url到uiwebview地址栏然后点击“保存”按钮,整个页面会被保存,但是webview中的其他浏览不会被自动缓存。我该怎么做呢?
  • 按下保存按钮的那一刻,您应该初始化自定义缓存并刷新 UIWebView。加载网页的那一刻,您应该初始化标准缓存。 (禁用自定义缓存)
  • 如果我的应用程序中有两个UIWebView,一个用于普通浏览,另一个用于后台网页保存操作。我打开/关闭自定义缓存会影响UIWebView进行普通浏览对吗?
  • 如果他们同时下载,那么是的,它会缓存两个页面。对于页面本身,您可以在 NSUrlCache 中添加一个 if 检查。我认为没有办法判断其他文件(图像)是从哪个页面下载的。
  • 我尝试在初始请求中添加一个标头标志,然后检查缓存,如果是缓存它,否则通过它。但是内部资源(图片)是由UIWebView单独请求的,这些请求不能被拦截修改header,而且它们没有特征显示它们属于哪个请求,所以我没有办法检查这些后续请求。我试过了由推荐人检查,但并不总是正确的。我找不到更多的方法。
猜你喜欢
  • 2016-01-26
  • 2019-11-25
  • 2013-01-11
  • 2011-11-24
  • 1970-01-01
  • 2011-05-20
  • 2020-07-19
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多