簡體   English   中英

iPhone UIWebView 緩慢加載到本地 HTML 文件

[英]iPhone UIWebView slow loading to local HTML files

我正在開發一個應用程序,需要在保存頁面的整個 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可以更快地加載它?

PS:它在模擬器(離線)上加載非常快,但在設備上需要很長時間(考慮到它已經離線緩存文件)

感謝您的幫助。

您的解決方案實際上是否緩存了 html 文件以外的內容,即圖片、css 等,並在 html 頁面中重新鏈接它們? 我猜你正在下載和緩存 html 頁面和外部資源,然后 UIWebView 正在加載該 html 並且仍然出去加載外部資源。 這可以解釋模擬器上的快速性能和設備上的較慢性能。

這是一個旨在完全按照您的要求執行的庫: ASIWebPageRequest

還應注意,這可能只是磁盤 I/O 瓶頸的一種情況。 我知道在我的項目中,我在 uitableview 中加載大圖像,即使在緩存它們之后,我也注意到將它們從磁盤中拉出時有相當多的延遲,因為它們太大了。

我發現某些類型的 CSS 可以使 WebView 渲染停止。 例如:

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

這在模擬器中效果很好,看起來也不錯。 但是在手機上(即使是 iPhone 4、iOS 4.2),一個簡單的頁面渲染需要 10 秒。

由於這可能只是需要時間,因為它需要解析和呈現頁面,您可以考慮在后台啟動 UIWebView; 即作為子視圖添加,但不可見。

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

如果它在不可見的情況下不做任何事情,請將大小減小到 1x1 並設置不透明度 = 0,並將該像素放置在不會干擾觸摸事件處理的地方。

不完美,但它可能有效。

我幾乎可以肯定你永遠無法做到這一點。 UIWebView 只需要一些時間來處理您的網頁,即使它是本地頁面。

記住這一點,您可以嘗試在頁面顯示之前預加載頁面。 例如,如果您在用戶按下按鈕后顯示它,則在您顯示按鈕而不是用戶實際按下按鈕時預加載頁面。 用戶不會注意到加載緩慢,因為它是在后台處理的,所以當用戶按下按鈕時頁面已經加載。

萬一有人發生同樣的事情在我身上......

我有一個加載字符串 html 的 UIWebView,並且每個資源(js 和 css)都存儲在本地。

我遇到過通過互聯網連接加載內容有點慢(加載並在我的控制器中顯示 webview 需要 1 或 2 秒)但是當我嘗試在沒有互聯網連接的情況下加載同一頁面時,它很快,非常快.

我記得我的 HTML 模板在開始時有這個<base href="http://somesite.com" /> ,我曾經用來加載一些內容中的相對路徑的圖像。

刪除該工作作為魅力。 因此,即使您在 HTML 中沒有對外部內容的任何引用,這也會使您的 Web 視圖加載速度變慢。

我可以讓您了解將 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 上顯示背景圖片

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

我沒有試過這個,但請嘗試讓我知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM