【问题标题】:iPhone UIWebView slow loading to local HTML filesiPhone UIWebView 缓慢加载到本地 HTML 文件
【发布时间】:2011-01-02 00:54:12
【问题描述】:

我正在开发一个应用程序,该应用程序需要在保存页面的整个 HTML 后(通过链接将每个文件与 HTML 文件一起存储)后(完全)缓存网页及其 CSS 文件和图像。

在离线查看 HTML 文件时,UIWebView 需要很长时间才能加载页面,因为我已经离线,并且文件连同其 CSS 和图像都在磁盘上。

我正在使用此代码来加载文件:

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

有没有其他方法可以将文件加载到UIWebView 可以更快地加载它?

P.S:它在模拟器上加载非常快(离线),但在设备上需要很长时间(考虑到它已经离线缓存文件)

感谢您的帮助。

【问题讨论】:

  • 这些是大网页吗?您正在加载什么类型的设备?请记住,WebKit 的很多性能都受 CPU 和内存限制,而不仅仅是连接;与加载“实时”相比,速度差异如何?
  • 是的,它们有点大,但它们处于离线状态(磁盘上的本地),没有涉及互联网连接,我正在 iPhone 3G 上加载它们
  • 正如 Ben 所说,呈现网页涉及非零处理时间。 iPhone 3G 的处理器比台式机 Mac 慢得多。您是否尝试过将这些页面存储在本地 Web 服务器上并通过 Mobile Safari 通过 WiFi 加载它们?
  • 不,从未尝试过,但我会尝试一下,谢谢布拉德。
  • Fwiw,有一个 WWDC 演讲(WWDC 2012 Session 601),它提供了一些关于提高 WebKit 加载性能的见解。但是,没有什么能专门解决这个问题。

标签: iphone uiwebview view offline performance


【解决方案1】:

即使在我的情况下,将本地 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];

我没有尝试过,但请尝试告诉我。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          这里有一个库,旨在完成您想要做的事情:ASIWebPageRequest。

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

          【讨论】:

          • 您是否介意在这里重读您的帖子并澄清一下。我读了很多次,无法真正理解您在第一段中要说的内容。该链接非常感谢。
          【解决方案6】:

          我可以为您提供有关将 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 准备就绪时显示图像来提高感知性能的方法。我得到的一些答案在这里:

          Displaying a background image on UIWebView

          【讨论】:

            【解决方案7】:

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

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

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

            并不完美,但它可能会起作用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-06
              • 2011-10-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多