Подтвердить что ты не робот

IPhone UIWebView медленная загрузка в локальные HTML файлы

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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