iOS 6 - UIWebView loadHTMLString не работает должным образом

Если кто-то сталкивался с описанной ниже проблемой, пожалуйста, дайте мне знать, если вы смогли найти решение. Я потратил пару дней, пытаясь найти решение, но пока безуспешно. Я использую XCode 4.5 с iOS 6 SDK Golden Master.

По сути, мое приложение читает HTML-файл и передает его содержимое в веб-представление для рендеринга.

NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"html"];
NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];

NSURL *baseURL = [NSURL URLWithString:@"http://mysite.com"];

[webView loadHTMLString:html baseURL:baseURL];

HTML-код содержит несколько тегов ‹link›, например: ‹link href="/webshare/accounts/maxk/styles/mobile_app_iphone_article.css?1312306173" media="screen" rel="stylesheet" type="text/css" /›

Проблема в том, что у UIWebView возникают проблемы с загрузкой файла CSS. UIWebViewDelegate сразу же получает webViewDidStartLoad, но до получения сообщения webViewDidFinishLoad проходит около 5 минут. CSS не подхватывается.

Если я уберу ссылку из HTML, все работает нормально.


person MaxK    schedule 17.09.2012    source источник
comment
Вы уверены, что это проблема, связанная с iOS6? Я думаю, что у меня была похожая проблема под iOS4 ... ах да, я не мог решить проблему и прибегнул к включению всего, что мне было нужно, в локальный файл HTML, который у меня был, поместив CSS в ‹head›. По сути, я полностью заменил голову из своего HTML. Прости.   -  person Akku    schedule 20.10.2012
comment
Да, проблема была в одном из наших классов, который расширял NSURLCache. Некоторое поведение изменилось в iOS 6, поэтому оно не работало должным образом.   -  person MaxK    schedule 22.10.2012


Ответы (3)


У меня была похожая проблема в моих веб-представлениях после выхода iOS 6. Попробуйте установить для следующего свойства UIWebView значение true (YES) {доступно только в iOS 6+}:

 suppressesIncrementalRendering
 A Boolean value indicating whether the web view suppresses content rendering until it is
 fully loaded into memory.

 @property(nonatomic) BOOL suppressesIncrementalRendering

По сути, в моих обстоятельствах асинхронная загрузка контента создала немного странное состояние гонки, которого раньше не было. Мне понадобилось время, чтобы найти его. Я также согласен с Брайаном: используйте прокси-программы и следите за своим трафиком, чтобы убедиться, что все, что вам нужно, приходит и когда приходит. Это может быть очень полезно.

Дайте мне знать, если это поможет?

person Miles Alden    schedule 25.11.2012

Не имея прямого доступа к проекту, действительно сложно сказать. Вы пытались загрузить страницу в локальном браузере, чтобы убедиться, что css действительно загружается? Если он загружается, я бы предложил запустить приложение в симуляторе, а также запустить что-то вроде Charles proxy. Чарльз будет записывать все ваши исходящие запросы и отображать их результаты. Таким образом, вы можете определить, является ли проблема действительно внутренней или внешней по отношению к SDK.

Если у вас есть учетная запись разработчика Apple, посмотрите видеоролики WWDC 2012 Session. Вы можете найти их здесь: https://developer.apple.com/videos/wwdc/2012/ . Есть одно видео под названием «Отладка UIWebViews и веб-сайтов на iOS». Я еще не смотрел его, но он может содержать некоторую информацию, которая поможет вам решить проблему.

Удачи!

person Brian Douglas Moakley    schedule 26.10.2012

Итак, если все css и другие вещи находятся на удаленном сервере, почему вы загружаете html из локального файла? Вероятно, это связано с безопасностью (вы пытаетесь загрузить html из локального файла, а другие данные из удаленного), или просто проблема с обработкой baseURL в UIWebView.

person Nickolay Olshevsky    schedule 04.11.2012