iPhone UIWebView медленная загрузка в локальные файлы HTML - PullRequest
28 голосов
/ 06 января 2010

Я разрабатываю приложение, которое требует кэширования веб-страниц (полностью) вместе с их CSS-файлами и изображениями после сохранения всего HTML-кода страницы (переходя по ссылкам для хранения каждого файла вместе с HTML-файлом).

При просмотре 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 .: он очень быстро загружается на симуляторе (в автономном режиме), но на устройстве это занимает много времени (учитывая, что он уже находится в автономном режиме кэшированного файла)

Спасибо за помощь.

Ответы [ 6 ]

6 голосов
/ 04 августа 2010

Является ли ваше решение на самом деле кешировать что-то, кроме html-файла, то есть рисунки, css и т. Д., И перекомпоновывать их на html-странице?Я предполагаю, что вы загружаете и кэшируете html-страницу и внешние ресурсы, тогда UIWebView загружает этот html и все еще собирается загружать внешние ресурсы.Это объясняет высокую производительность на симуляторе и более медленную производительность на устройстве.

Вот библиотека, предназначенная для того, чтобы делать именно то, что вы пытаетесь сделать: ASIWebPageRequest .

Следует также отметить, что это может быть просто узким местом дискового ввода-вывода.Я знаю, что в моем проекте я загружал большие изображения в uitableview, и даже после того, как они были кэшированы, я заметил некоторую задержку при извлечении их с диска, потому что они были такими большими.

4 голосов
/ 15 января 2011

Я обнаружил, что некоторые виды CSS могут остановить рендеринг WebView. Например:

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

Это прекрасно работает в симуляторе, тоже выглядит красиво. Но на телефоне (даже iPhone 4, iOS 4.2) простая страница отрисовывается за 10 секунд.

3 голосов
/ 03 августа 2010

Поскольку это, вероятно, просто занимает много времени, потому что необходимо проанализировать и визуализировать страницу, вы можете рассмотреть запуск UIWebView в фоновом режиме; то есть добавлено как подпредставление, но не видно.

Возможно, UIWebView достаточно умен, чтобы знать, что ему ничего не нужно делать, но я подозреваю, что, по крайней мере, разбор html и css выполняется сразу.

Если он ничего не делает, не будучи видимым, уменьшите размер до 1x1 и установите непрозрачность = 0 и поместите этот пиксель в такое место, где он не сможет помешать обработке событий касания.

Не идеально, но может работать.

1 голос
/ 10 августа 2010

Я почти уверен, что вы никогда не сможете этого сделать. UIWebView просто требуется некоторое время для обработки вашей веб-страницы, даже если это локальная страница.

Имея это в виду, вы можете попытаться предварительно загрузить страницу перед ее показом. Например, если вы показываете это после того, как пользователь нажимает кнопку, предварительно загружайте страницу, когда вы показываете кнопку, а не когда пользователь фактически нажимает кнопку. Пользователь не замечает медленной загрузки, потому что она обрабатывается в фоновом режиме, поэтому, когда пользователь нажимает кнопку, страница уже загружена.

0 голосов
/ 28 февраля 2014

На всякий случай, если со мной случится то же самое ...

У меня был UIWebView, который загружал строку html, и каждый ресурс (js и css) хранился локально.

Я сталкивался с тем, что загрузка контента с подключением к Интернету происходила довольно медленно (1 или 2 секунды для загрузки и отображения веб-просмотра в моем контроллере), но когда я попытался загрузить ту же страницу БЕЗ подключения к интернету, это было быстро очень быстро.

Я вспомнил, что мой HTML-шаблон имел это в начале <base href="http://somesite.com" />, который я использовал для загрузки некоторых изображений с относительными путями в некотором содержимом.

Снятие этой работы как очарование. Так что это может замедлить загрузку веб-представления, даже если у вас нет ссылок на внешний контент в вашем HTML.

0 голосов
/ 03 августа 2010

Я могу дать вам представление об альтернативных способах загрузки 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...