29

I'm developing an app that requires caching web pages (completely) along with their CSS files and images after saving the entire HTML of the page (going through the links to store each file along with the HTML file).

While viewing the HTML file offline, UIWebView takes a long time to load the page, given that I'm already offline, and the file is on disk along with its CSS and images.

I'm using this code to load the file:

  NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath];
  [wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL fileURLWithPath:self.htmlFolderPath isDirectory:YES]];

Is there any other means of loading the file to the UIWebView that can load it faster?

P.S: it loads very fast on simulator (offline) but on device it takes a long time (considering its an already offline cached file)

Thanks for help.

4

7 回答 7

7

您的解决方案是否实际上缓存了 html 文件以外的内容,即图片、css 等,并在 html 页面中重新链接它们?我猜你正在下载和缓存 html 页面和外部资源,然后 UIWebView 正在加载该 html 并且仍然出去加载外部资源。这可以解释模拟器上的快速性能和设备上的较慢性能。

这是一个旨在完成您正在尝试做的事情的库:ASIWebPageRequest

还应注意,它可能只是磁盘 i/o 瓶颈的一种情况。我知道在我的项目中,我在 uitableview 中加载大图像,即使在它们被缓存之后,我也注意到将它们从磁盘上拉下来时有相当多的延迟,因为它们太大了。

于 2010-08-03T21:30:12.443 回答
4

我发现某些类型的 CSS 可以使 WebView 渲染停止。例如:

body { -webkit-box-shadow:inset 0 0 100px #222; }

这在模拟器中效果很好,看起来也不错。但在手机上(甚至是 iPhone 4、iOS 4.2),一个简单的页面需要 10 秒才能呈现。

于 2011-01-15T14:59:58.863 回答
3

由于这可能只是需要时间,因为它需要解析和呈现页面,因此您可以考虑在后台启动 UIWebView;即添加为子视图,但不可见。

也许 UIWebView 足够聪明,知道它不需要做任何事情,但我怀疑至少 html 和 css 解析是立即完成的。

如果它在不可见的情况下不做任何事情,请将大小减小到 1x1 并设置 opacity=0,并将该像素放在不会干扰触摸事件处理的地方。

不完美,但它可能会奏效。

于 2010-08-03T11:47:13.410 回答
1

我几乎可以肯定你永远无法做到这一点。UIWebView 只需要一些时间来处理您的网页,即使它是本地页面。

记住这一点,您可以尝试在页面显示之前预加载它。例如,如果您在用户按下按钮后显示它,则在显示按钮时而不是在用户实际按下按钮时预加载页面。用户不会注意到加载缓慢,因为它是在后台处理的,所以当用户按下按钮时,页面已经加载。

于 2010-08-10T11:12:17.640 回答
0

我可以为您提供有关将 HTML 从文件加载到 UIWebView 的替代方法的想法。我有一个小项目使用 Objective-C 作为 UIWebView 的纯包装器

项目在这里,但主要代码如下:http: //github.com/robb1e/iWeb

- (void)viewDidLoad {
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html" inDirectory:@"."]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];
    [super viewDidLoad];
}

我还在探索通过在 DOM 准备就绪时显示图像来提高感知性能的方法。我得到的一些答案在这里:

在 UIWebView 上显示背景图像

于 2010-08-03T13:23:00.500 回答
0

万一有人对我发生同样的事情……

我有一个加载字符串 html 的 UIWebView,并且每个资源(js 和 css)都存储在本地。

我遇到过通过互联网连接加载内容的速度有点慢(加载并在我的控制器中显示 webview 需要 1 或 2 秒)但是当我尝试在没有互联网连接的情况下加载相同的页面时它很快,非常快.

我记得我的 HTML 模板一开始就有这个<base href="http://somesite.com" />,我用来加载一些图像,在某些内容中具有相对路径。

去掉那个工作作为魅力。因此,即使您的 HTML 中没有对外部内容的任何引用,这也会使您的 Web 视图加载速度变慢。

于 2014-02-28T18:17:35.177 回答
0

即使在我的情况下,将本地 html 文件加载到 webview 也花费了太多时间。

尝试如下加载本地 html 文件,它对我有用:

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"website_and_mobile_tnc-1" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil]; 
[_TandCView loadHTMLString:[headerString stringByAppendingString:htmlString] baseURL:nil];

如果您想使用 NSData 加载,请尝试在您的代码中将 baseUrl 设置为“nil”。

我已将您的代码修改如下,

    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath];
  [wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:nil];

我没有尝试过,但请尝试让我知道。

于 2020-09-09T10:14:03.003 回答