web-dev-qa-db-ja.com

iPhoneUIWebViewのローカルHTMLファイルへの読み込みが遅い

ページのHTML全体を保存した後(リンクを経由して各ファイルをHTMLファイルと一緒に保存する)、CSSファイルと画像とともにWebページを(完全に)キャッシュする必要があるアプリを開発しています。

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にロードする他の方法で、ファイルをより速くロードできますか?

追伸:シミュレーター(オフライン)では非常に高速に読み込まれますが、デバイスでは(すでにオフラインでキャッシュされたファイルを考慮すると)時間がかかります

手伝ってくれてありがとう。

28
Mina Mikhael

あなたのソリューションは実際にhtmlファイル以外のもの、つまり写真やcssなどをキャッシュし、それらをhtmlページに再リンクしていますか? HTMLページと外部リソースをダウンロードしてキャッシュしていると思いますが、UIWebViewはそのHTMLをロードし、外部リソースをロードするために出かけます。これは、シミュレータでのパフォーマンスが速く、デバイスでのパフォーマンスが遅いことを説明します。

これは、あなたがやろうとしていることを正確に実行するように設計されたライブラリです: ASIWebPageRequest

また、単にディスクI/Oのボトルネックの場合である可能性があることにも注意してください。私のプロジェクトでは、大きな画像をuitableviewに読み込んでいて、キャッシュされた後でも、画像が非常に大きいため、ディスクから引き出すときにかなりの遅延に気づきました。

6
ACBurk

特定の種類のCSSがWebViewレンダリングを停止させる可能性があることがわかりました。例えば:

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

これはシミュレーターでうまく機能し、見栄えもします。しかし、電話(iPhone 4、iOS 4.2でも)では、単純なページのレンダリングには10秒かかります。

4
foz

これはページを解析してレンダリングする必要があるため、おそらく時間がかかるだけなので、バックグラウンドでUIWebViewを起動することを検討してください。つまり、サブビューとして追加されますが、表示されません。

UIWebViewは、何もする必要がないことを知っているほど賢いのかもしれませんが、少なくともhtmlとcssの解析はすぐに行われると思います。

表示されないと何も起こらない場合は、サイズを1x1に減らし、不透明度= 0に設定し、そのピクセルをタッチイベントの処理に干渉しない場所に配置します。

完璧ではありませんが、うまくいくかもしれません。

3
mvds

私はあなたがこれをすることが決してできないだろうとほぼ確信しています。 UIWebViewは、ローカルページであっても、Webページを処理するのに少し時間がかかります。

そのことを念頭に置いて、ページが表示される前にページをプリロードしてみてください。たとえば、ユーザーがボタンを押した後に表示する場合、ユーザーが実際にボタンを押したときではなく、ボタンを表示したときにページをプリロードします。読み込みが遅いことにユーザーは気づきません。これはバックグラウンドで処理されているため、ユーザーがボタンを押すと、ページが既に読み込まれているためです。

1
elslooo

万が一誰かが私に同じことが起こった場合に備えて...

文字列htmlをロードするUIWebViewがあり、すべてのリソース(jsおよびcss)がローカルに保存されていました。

インターネット接続でコンテンツをロードするのはある種遅い(ロードしてコントローラーにWebビューを表示するのに1〜2秒)ことに直面しましたが、インターネット接続なしで同じページをロードしようとすると、高速で本当に高速でした。

私のHTMLテンプレートには最初にこれがあったことを思い出しました<base href="http://somesite.com" />いくつかのコンテンツで、相対パスを使用していくつかの画像をロードするために使用しました。

その作品を魅力として取り除く。そのため、HTMLに外部コンテンツへの参照がない場合でも、Webビューの読み込みが遅くなる可能性があります。

0
iVela

HTMLをファイルからUIWebViewにロードする別の方法についてのアイデアを提供できます。私が持っている小さなプロジェクトは、UIWebViewの純粋なラッパーとしてObjective-Cを使用しています

プロジェクトはここにありますが、メインコードは以下のとおりです: 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の準備中に画像を表示することで、知覚されるパフォーマンスを向上させる方法も模索しています。私が持っていたいくつかの答えはここにあります:

IWebViewに背景画像を表示する

0
Robbie